gpt4 book ai didi

c# - protobuf-net序列化返回空数组

转载 作者:行者123 更新时间:2023-11-30 22:20:56 36 4
gpt4 key购买 nike

我使用“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,对于消息,它是 null。问题出在哪里?

最佳答案

And in the testings the values vor opcode is 0 and for message its null. Where is the Problem?

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

关于c# - protobuf-net序列化返回空数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14728692/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com