2

我使用“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]}" 但应该有一些数据。 "packet" 的数据是:

[ProtoContract]
public struct Packet
{
    [ProtoMember(1)] 
    public int opcode;

    [ProtoMember(2)] 
    public string message;
}

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

4

1 回答 1

3

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

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

如果您希望它处理“框架”以便可以单独阅读多条消息,请使用SerializeWithLengthPrefix(and 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();
    }
}
于 2013-02-06T12:22:13.347 回答