更改 MSMQ 正文的格式



>我有一个对象,我想以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;
}

最新更新