C# MSMQ含二进制Body的消息出现额外前缀字节问题咨询
问题:MSMQ消息队列中UDP接收数据前的额外字节是什么?
我用UDP监听器接收字节数组并写入MSMQ消息队列,功能正常,但队列里的消息数据前有额外字节。代码如下:
byte[] data = listener.Receive(ref endpoint); Console.WriteLine($"Received broadcast from {endpoint} :"); Console.WriteLine($" {Encoding.ASCII.GetString(data, 0, data.Length)}"); Message msg = new Message(); msg.Body = data; msg.Formatter = new BinaryMessageFormatter(); _queue.Send(msg, MessageQueueTransactionType.Single);
当接收的是6字节的"Hello!"时,队列中消息的二进制内容如下:
00 01 00 00 00 FF FF FF .....ÿÿÿ FF 01 00 00 00 00 00 00 ÿ....... 00 0F 01 00 00 00 06 00 ........ 00 00 02 48 65 6C 6C 6F ...Hello 21 0B !.
请问这些前缀额外字节是什么?
解答
这些额外字节是BinaryMessageFormatter序列化时自动添加的.NET对象元数据,用来描述序列化内容的结构:
- 开头字节包含序列化版本信息、对象类型标识(这里对应byte[]类型的标识)
- 中间的
06 00 00 00是小端序存储的字节数组长度(对应你传入的6字节"Hello!") - 最后才是你实际的业务数据
48 65 6C 6C 6F 21(即"Hello!"的ASCII编码)
如果只想写入原始字节数组、避免额外前缀,可以绕过Body属性,直接操作BodyStream:
byte[] data = listener.Receive(ref endpoint); Console.WriteLine($"Received broadcast from {endpoint} :"); Console.WriteLine($" {Encoding.ASCII.GetString(data, 0, data.Length)}"); Message msg = new Message(); // 直接写入原始字节到流,无需格式化器 msg.BodyStream.Write(data, 0, data.Length); _queue.Send(msg, MessageQueueTransactionType.Single);
这样写入队列的消息就只有你实际的字节数据,不会附带序列化前缀。
内容的提问来源于stack exchange,提问作者nouns
相关产品推荐
相关产品推荐

