我使用“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 [] ist在结尾“{byte [0]}”但是应该有一些数据。 “数据包”的数据是:
[ProtoContract]
public struct Packet
{
[ProtoMember(1)]
public int opcode;
[ProtoMember(2)]
public string message;
}
在测试中,值vor操作码为0,而消息为null。 问题出在哪里?
答案 0 :(得分:3)
在测试中,值vor操作码为0,而消息为null。问题出在哪里?
是什么让你觉得有问题? 0字节对于protobuf-net来说是完全合法的,并且在这种情况下是预期的,因为序列化没有什么有趣的东西;它可以反序列化0
和null
,而无需任何外部数据。关键点在于:如果您反序列化相同的零字节, 将返回 Packet
0
}操作码和null
消息。完成工作。
如果您希望它处理“框架”以便可以单独阅读多条消息,请使用SerializeWithLengthPrefix
(和DeserializeWithLengthPrefix
),但是:此处没有问题。
实际上,您的代码中存在错误:
byte[] packetArray = stream.GetBuffer();
如果您使用GetBuffer()
而不跟踪.Length
,则会获得超大后备缓冲区,其中包含垃圾(在本例中为零)。请改用ToArray()
。所以:
public static byte[] PacketToArray(Packet packet) {
using(MemoryStream stream = new MemoryStream()) {
Serializer.Serialize(stream, packet); // or SerializeWithLengthPrefix
return stream.ToArray();
}
}