Protobuf网络串行化/反序列化c#与Linux c++
本文关键字:Linux c++ 反序列化 网络 Protobuf | 更新日期: 2023-09-27 18:29:01
我通过TCP套接字在Windows C#客户端和Linux C++服务器之间传递消息。C#代码使用protobuf-netv2,Linux是谷歌的protobuf版本。我传递的小测试对象有6个字段(Enum、Int、String)。我需要帮助解决两个问题:
-
C#部分无法反序列化从Linux发送的数据,除非用构造函数中的二进制数组初始化用作数据存储的内存流。数组不能大于从Linux发送的数据(在我的情况下是9个字节)。代码示例-byte[]data=new byte[9],将数据从套接字复制到数组中。MemoryStream myStream=新的MemoryStream(数据),将myStream传递给序列化程序。反序列化。。。如果我在没有二进制缓冲区或1024字节数组的情况下初始化MemoryStream,则反序列化将创建空对象,而不处理数据。
-
当我尝试用与Linux相同的值在C#中序列化相同的对象时,数据的大小是11字节,而在Linux上是9字节。我在调试器中检查了字节数组,C#版本在数组的索引2-11中有与Linux数据相同的9个字段。索引0为8,索引1为9。我可以尝试通过修改Linux反序列化代码来解决这个问题,只需要知道,我是否总是要处理消息开头的两个额外字段。此外,如果要修复我在C#中的反序列化,我可以在Linux上生成的消息中添加两个额外的字段,只需要知道如何为这两个字段生成值。
谢谢。亚历克斯。
- 简单地说,Protobuf数据不是自终止的。但是,您可以创建一个
MemoryStream
或ProtoReader
,占用更大的有效负载,但限制为虚拟长度。如果你发送多条消息,你需要知道有效载荷的长度——这是不可避免的。这通常通过长度前缀来实现。我希望这会引发随机错误——很可能是"无效字段头0"——我想知道你是否接受了这个异常 - 没有具体的例子就无法发表评论;很可能与字段号1的默认值有关(标头8=="字段1变量")