protobuf-net 序列化返回空数组

Posted

技术标签:

【中文标题】protobuf-net 序列化返回空数组【英文标题】:protobuf-net Serialization returns empty array 【发布时间】:2013-02-06 12:05:12 【问题描述】:

我使用“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;

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

【问题讨论】:

我建议您致电 ToByteArray() 而不是 GetBuffer() - 它不会解决此问题,但它为您提供一个包含适量数据的字节数组,当您完成其余工作时。 【参考方案1】:

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

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

如果您希望它处理“框架”以便可以单独阅读多条消息,请使用SerializeWithLengthPrefix(和DeserializeWithLengthPrefix),但是:这里没问题。

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

byte[] packetArray = stream.GetBuffer();

如果您使用 GetBuffer() 而不跟踪 .Length,您将获得 oversized 后备缓冲区,其中包含垃圾(在本例中为零)。请改用ToArray()。所以:

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

【讨论】:

以上是关于protobuf-net 序列化返回空数组的主要内容,如果未能解决你的问题,请参考以下文章

protobuf-net v3 中的数组或列表中的空对象

Protobuf-Net 空列表

protobuf-net 使用啥基本序列化器来输出字节数组?

使用 ProtoBuf-Net,如何(反)序列化多维数组?

Protobuf-net 对字节数组进行序列化/反序列化

Protobuf-net 错误 - 序列化设置为 null 的固定数组