protobuf-net序列化返回空数组
本文关键字:数组 返回 序列化 protobuf-net | 更新日期: 2023-09-27 17:57:50
我使用"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;
}
在测试中,vor操作码的值为0,消息的值为null。问题在哪里?
在测试中,vor操作码的值为0,消息的值为null。问题在哪里?
是什么让你觉得有问题?0字节对于protobuf-net来说是完全合法的,并且在这种情况下是预期的,因为没有什么有趣的序列化内容;它可以在不需要任何外部数据的情况下对CCD_ 1和CCD_。这里的关键点是:如果反序列化相同的零字节,将返回带有0
操作码和null
消息的Packet
。工作完成了。
如果您希望它处理"成帧",以便可以单独读取多条消息,那么可以使用SerializeWithLengthPrefix
(和DeserializeWithLengthPrefix
),但是:这里没有问题。
实际上,您的代码中有一个错误:
byte[] packetArray = stream.GetBuffer();
如果使用GetBuffer()
而不跟踪.Length
,则会得到过大的备份缓冲区,其中包含垃圾(在本例中为零)。请改用0
0。因此:
public static byte[] PacketToArray(Packet packet) {
using(MemoryStream stream = new MemoryStream()) {
Serializer.Serialize(stream, packet); // or SerializeWithLengthPrefix
return stream.ToArray();
}
}