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。问题在哪里?

protobuf-net序列化返回空数组

在测试中,vor操作码的值为0,消息的值为null。问题在哪里?

是什么让你觉得有问题?0字节对于protobuf-net来说是完全合法的,并且在这种情况下是预期的,因为没有什么有趣的序列化内容;它可以在不需要任何外部数据的情况下对CCD_ 1和CCD_。这里的关键点是:如果反序列化相同的零字节,将返回带有0操作码和null消息的Packet。工作完成了。

如果您希望它处理"成帧",以便可以单独读取多条消息,那么可以使用SerializeWithLengthPrefix(和DeserializeWithLengthPrefix),但是:这里没有问题。

实际上,您的代码中有一个错误:

byte[] packetArray = stream.GetBuffer();

如果使用GetBuffer()而不跟踪.Length,则会得到过大的备份缓冲区,其中包含垃圾(在本例中为零)。请改用00。因此:

public static byte[] PacketToArray(Packet packet) {
    using(MemoryStream stream = new MemoryStream()) {
        Serializer.Serialize(stream, packet); // or SerializeWithLengthPrefix
        return stream.ToArray();
    }
}