C# protobuf网络序列化返回空数组
我使用“protobuf net”序列化结构,但它返回一个空数组C# protobuf网络序列化返回空数组,c#,protobuf-net,C#,Protobuf Net,我使用“protobuf net”序列化结构,但它返回一个空数组 public static byte[] PacketToArray(Packet packet) { IFormatter formatter = new BinaryFormatter(); MemoryStream stream = new MemoryStream(); Serializer.Serialize(stream, packet); byte[] packetArray = s
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]}”处,但其中应该有一些数据。
“数据包”的数据为:
在测试中,vor操作码的值为0,消息的值为null。
问题在哪里
在测试中,vor操作码的值为0,消息的值为null。问题在哪里
你凭什么认为有问题?0字节对于protobuf net来说是完全合法的,在这种情况下是应该的,因为没有什么有趣的东西可以序列化;它可以反序列化0
和null
,而不需要任何外部数据。这里的关键点是:如果反序列化相同的零字节,将返回带有0
操作码和null
消息的Packet
。工作完成了
如果您想让它处理“帧”,以便可以单独读取多条消息,那么可以使用SerializeWithLengthPrefix
(和反序列化WithLengthPrefix
),但是:这里没有问题
实际上,您的代码中有一个bug,不过:
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();
}
}
我建议您调用
ToByteArray()
而不是GetBuffer()
——它不会解决这个问题,但当其余部分正常工作时,它将为您提供一个具有正确数据量的字节数组。
public static byte[] PacketToArray(Packet packet) {
using(MemoryStream stream = new MemoryStream()) {
Serializer.Serialize(stream, packet); // or SerializeWithLengthPrefix
return stream.ToArray();
}
}