protobuf-net 序列化返回空数组
Posted
技术标签:
【中文标题】protobuf-net 序列化返回空数组【英文标题】:protobuf-net Serialization returns empty array 【发布时间】:2013-02-06 12:05:12 【问题描述】:我使用“protobuf-net”序列化一个结构,但它返回一个空数组。
public static byte[] PacketToArray(Packet packet)
IFormatter formatter = new BinaryFormatter();
MemoryStream stream = new MemoryStream();
Serializer.Serialize(stream, packet);
byte[] packetArray = stream.GetBuffer();
stream.Close();
return packetArray;
packetArray[] 在结尾 "byte[0]" 但里面应该有一些数据。 “包”的数据是:
[ProtoContract]
public struct Packet
[ProtoMember(1)]
public int opcode;
[ProtoMember(2)]
public string message;
在测试中,操作码的值为 0,消息为空。 问题出在哪里?
【问题讨论】:
我建议您致电ToByteArray()
而不是 GetBuffer()
- 它不会解决此问题,但它会为您提供一个包含适量数据的字节数组,当您完成其余工作时。
【参考方案1】:
在测试中,操作码的值为 0,消息为空。问题出在哪里?
是什么让您认为有问题? 0 字节对于 protobuf-net 来说是完全合法的,并且在这种情况下是可以预期的,因为没有什么有趣的序列化;它可以反序列化0
和null
,而不需要任何外部数据。这里的关键点:如果您反序列化相同的零字节,您将返回一个带有0
操作码的Packet
和一个null
消息。任务完成。
如果您希望它处理“框架”以便可以单独阅读多条消息,请使用SerializeWithLengthPrefix
(和DeserializeWithLengthPrefix
),但是:这里没问题。
实际上,您的代码中有一个错误:
byte[] packetArray = stream.GetBuffer();
如果您使用 GetBuffer()
而不跟踪 .Length
,您将获得 oversized 后备缓冲区,其中包含垃圾(在本例中为零)。请改用ToArray()
。所以:
public static byte[] PacketToArray(Packet packet)
using(MemoryStream stream = new MemoryStream())
Serializer.Serialize(stream, packet); // or SerializeWithLengthPrefix
return stream.ToArray();
【讨论】:
以上是关于protobuf-net 序列化返回空数组的主要内容,如果未能解决你的问题,请参考以下文章