C# protobuf网络序列化返回空数组

C# protobuf网络序列化返回空数组,c#,protobuf-net,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 = s

我使用“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]}”处,但其中应该有一些数据。 “数据包”的数据为:

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

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

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

如果您想让它处理“帧”,以便可以单独读取多条消息,那么可以使用
SerializeWithLengthPrefix
(和
反序列化WithLengthPrefix
),但是:这里没有问题

实际上,您的代码中有一个bug,不过:

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();
    }
}

我建议您调用
ToByteArray()
而不是
GetBuffer()
——它不会解决这个问题,但当其余部分正常工作时,它将为您提供一个具有正确数据量的字节数组。
public static byte[] PacketToArray(Packet packet) {
    using(MemoryStream stream = new MemoryStream()) {
        Serializer.Serialize(stream, packet); // or SerializeWithLengthPrefix
        return stream.ToArray();
    }
}