protobuf-net序列化返回空数组

时间:2013-02-06 12:05:13

标签: 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 = 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。 问题出在哪里?

1 个答案:

答案 0 :(得分:3)

  

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

是什么让你觉得有问题? 0字节对于protobuf-net来说是完全合法的,并且在这种情况下是预期的,因为序列化没有什么有趣的东西;它可以反序列化0null,而无需任何外部数据。关键点在于:如果您反序列化相同的零字节, 将返回 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();
    }
}