>我有一个对象,我想以XML格式存储在MSMQ队列中。我希望它出现在队列正文中是这样的:
<?xml version="1.0"?>
<Object>
<Text>Hello World!</Text>
<Number>5</Number>
</Object>
但是,当我存储对象时,我会在正文中看到不同的结果:
3C 3F 78 6D 6C 20 76 65 <?xml ve
72 73 69 6F 6E 3D 22 31 rsion="1
2E 30 22 3F 3E 0D 0A 3C .0"?>..<
4F 62 6A 65 63 74 3E 0D Object>.
0A 09 3C 54 65 78 74 3E .<Text>H
48 65 6C 6C 6F 20 57 6F ello Wor
72 6C 64 21 3C 2F 54 65 ld!</tex
78 74 3E 0D 0A 09 3C 4E t>..<Num
75 6D 62 65 72 3E 35 3C ber>5</N
2F 4E 75 6D 62 65 72 3E umber>..
0D 0A 3C 2F 4F 62 6A 65 </Object
63 74 3E >
我不确定这里使用的实际格式是什么,所以我无法弄清楚如何更改它。我尝试将messageQueue.Formatter = new BinaryMessageFormatter();
和messageQueue.Formatter = new XmlMessageFormatter();
添加到 MessageQueue 对象,但我得到的结果完全相同。
我发送对象的代码是:
// This part of the code of creating the TestObject isn't what I'm using in development,
// this is just for showing you that I'm using an object.
TestObject item = new TestObject();
item.Text = "Hello World!";
item.Number = 5;
MessageQueue messageQueue;
Message message;
messageQueue = new MessageQueue(@".Private$myqueue");
message = new Message(item);
messageQueue.Send(message);
如何更改我的代码以确保它以 XML 格式发送和存储?
任何帮助将不胜感激。
上面的十六进制转储几乎与您右键单击消息上的"计算机管理/消息队列/专用队列/myqueue/队列消息"中的属性并选择"正文"选项卡时获得的结果相同。执行此操作时,查看器可能会向您显示字符串转储或十六进制转储。通常,大尺寸会为您提供十六进制转储。
要将对象序列化为 XML,只需将队列的MessageQueue.Formatter
或消息的Message.Formatter
(仅针对特定消息)设置为XmlMessageFormatter
,但要包含所需的类型。然后,该对象将成为序列化的 XML 消息。下面包括发布的代码,其中包含一些补充。
// This part of the code of creating the TestObject isn't what I'm using in development,
// this is just for showing you that I'm using an object.
TestObject item = new TestObject();
item.Text = "Hello World!";
item.Number = 5;
MessageQueue messageQueue;
Message message;
XmlMessageFormatter format = new XmlMessageFormatter(
new Type[] {
typeof(string),
typeof(TestObject)}
);
messageQueue = new MessageQueue(@".Private$myqueue");
message = new Message(item);
message.Formatter = format;
messageQueue.Send(message);
// ...
message = messageQueue.Receive();
Type messageType = message.Body.GetType();
if (messageType == typeof(string))
{
string newString = (string)message.Body;
}
else if (messageType == typeof(TestObject))
{
TestObject receiveItem = (TestObject)message.Body;
}