为什么以下简单的protobuf-net代码无法正常工作?

时间:2018-10-02 01:54:43

标签: c# protobuf-net

我试图弄清楚如何使用protobuf-net。下面的示例是故意的。它不能反映现实生活中的应用。

请注意:

var ms = new MemoryStream();
Serializer.Serialize(ms, 1234);
Serializer.Serialize(ms, 5678);
ms.Position = 0;
var n1 = Serializer.Deserialize<int>(ms);
var n2 = Serializer.Deserialize<int>(ms);
Debug.WriteLine(n1);
Debug.WriteLine(n2);

它输出:

5678
0

怎么了?

我正在使用protobuf-net 2.4.0

2 个答案:

答案 0 :(得分:2)

如评论中所述,Protobuf没有像您期望的那样“打包”的概念。流总是在反序列化时被完全读取,以前读取的值在流中再次出现时将被覆盖。因此,将多个消息写入单个流不会像您那样进行。不幸的是,没有简单的解决方法,您必须自己实现数据包拆分。一种实现方法是在消息的长度之前添加任何消息的前缀,并相应地拆分输入。这对于较大的消息很有用,但是您的消息仅包含一个整数,该整数将很难扩展。我真的建议在这种情况下完全不使用protobuf,相反,您可以看看他们的int-serialization例程(如果我没记错的话,可以使用一些动态长度编码),然后自己对单个int进行序列化和反序列化。

答案 1 :(得分:0)

您可以使用BitConverter将整数转换为字节数组,然后将数组发送到内存流:

以下链接可以帮助您

https://www.c-sharpcorner.com/uploadfile/mahesh/convert-integer-to-byte-array-in-C-Sharp/

然后,一旦有了字节数组数组,就可以执行以下操作:

var memoryStream = new MemoryStream();
for(int temp = 0; temp < bytArray.Length; temp++)
  memoryStream.Write(byteArray[temp], 0, byteArray[temp].Length);

最后,使用Protobuff获得内存流。