从msmq读取时的XML反序列化
本文关键字:XML 反序列化 msmq 读取 | 更新日期: 2023-09-27 18:15:34
我想在c# WPF应用程序中从消息队列读取XML消息。消息由vision代码单元保存到队列中。首先,我不确定保存在队列中的消息是否可用,因为它们是十六进制格式,看起来像这样:
FF FE 3C 00 3F 00 78 00 ÿþ<.?.x.
6D 00 6C 00 20 00 76 00 m.l. .v.
65 00 72 00 73 00 69 00 e.r.s.i.
6F 00 6E 00 3D 00 22 00 o.n.=.".
31 00 2E 00 30 00 22 00 1...0.".
20 00 65 00 6E 00 63 00 .e.n.c.
6F 00 64 00 69 00 6E 00 o.d.i.n.
67 00 3D 00 22 00 55 00 g.=.".U.
54 00 46 00 2D 00 31 00 T.F.-.1.
36 00 22 00 20 00 73 00 6.". .s.
74 00 61 00 6E 00 64 00 t.a.n.d.
61 00 6C 00 6F 00 6E 00 a.l.o.n.
...
从队列接收消息已经工作,但不知何故格式是错误的,因为我得到这个运行时异常"无效操作异常:不能反序列化作为参数传递的消息。无法识别序列化格式。"
我正在使用这个代码来读取消息:
public MainWindow()
{
InitializeComponent();
mqCustomerData = new MessageQueue(@".'private$'customerData");
mqCustomerData.Formatter = new XmlMessageFormatter(new Type[] { typeof(String) });
mqCustomerData.ReceiveCompleted += new ReceiveCompletedEventHandler(mqCustomerData_ReceiveCompleted);
mqCustomerData.BeginReceive(new System.TimeSpan(0, 0, 0, 30));
}
private void mqCustomerData_ReceiveCompleted(object sender, System.Messaging.ReceiveCompletedEventArgs e)
{
Message m = new Message();
m.Formatter = new XmlMessageFormatter(new Type[] { typeof(String) });
m = mqCustomerData.EndReceive(e.AsyncResult);
string text = (string)m.Body;
}
我已经搜索了这个问题,但没有找到一个有用的解决方案,只发现其他用户的帖子遇到同样的问题,像这里:http://www.webmasterworld.com/microsoft_asp_net/4119362.htm
我希望你们中有人能帮我解决这个问题。
在competent_tech的回答中,
没有过载Encoding.Unicode.GetString(m.Body);
接受一个字符串参数。
如果您想使用这种方法,则需要将字符串转换为字节数组-
byte[] arr;
using(MemoryStream ms = new MemoryStream())
{
m.BodyStream.Position = 0;
m.BodyStream.CopyTo(ms);
arr = ms.ToArray();
}
string s = Encoding.Unicode.GetString(arr, 0, arr.Length);
看起来数据是小端UTF-16,因为数据以FF FE开头。
您需要使用如下方式解码字符串:
string text = Encoding.Unicode.GetString(m.Body);