Protobuf net Siralization/deserialization c与Linux c++; < >我通过TCP套接字在Windows C客户端和Linux C++服务器之间传递消息。C#代码使用protobuf net v2,Linux Google的protobuf版本。我传递的小测试对象有6个字段(Enum、Int、String)。我需要两个问题的帮助:

Protobuf net Siralization/deserialization c与Linux c++; < >我通过TCP套接字在Windows C客户端和Linux C++服务器之间传递消息。C#代码使用protobuf net v2,Linux Google的protobuf版本。我传递的小测试对象有6个字段(Enum、Int、String)。我需要两个问题的帮助:,c#,c++,linux,serialization,protobuf-net,C#,C++,Linux,Serialization,Protobuf Net,C#部分无法反序列化从Linux发送的数据,除非用作数据存储的内存流在构造函数中用二进制数组初始化。数组不能大于从Linux发送的数据(在我的情况下为9字节)。代码示例-byte[]data=新字节[9],将数据从套接字复制到数组中。 MemoryStream myStream=新建MemoryStream(数据),将myStream传递给序列化程序。反序列化。。。 如果我在没有字节缓冲区或1024字节数组的情况下初始化MemoryStream,反序列化将创建空对象,而不处理数据 当我尝试用与L

C#部分无法反序列化从Linux发送的数据,除非用作数据存储的内存流在构造函数中用二进制数组初始化。数组不能大于从Linux发送的数据(在我的情况下为9字节)。代码示例-byte[]data=新字节[9],将数据从套接字复制到数组中。 MemoryStream myStream=新建MemoryStream(数据),将myStream传递给序列化程序。反序列化。。。 如果我在没有字节缓冲区或1024字节数组的情况下初始化MemoryStream,反序列化将创建空对象,而不处理数据

  • 当我尝试用与Linux相同的值在C#中序列化相同的对象时,数据的大小是11字节,而在Linux上是9字节。我在调试器中检查了字节数组,C#version在数组的索引2-11中有与Linux数据相同的9个字段。索引0是8,索引1是9。我可以尝试通过修改Linux反序列化代码来绕过这个问题,只需要知道,我是否总是需要在消息的开头处理两个额外的字段。另外,如果要修复我在C#中的反序列化,我可以在Linux上生成的消息中添加两个额外字段,只需要知道如何为这两个字段生成值

  • 谢谢。 亚历克斯

  • Protobuf数据不是自终止的。但是,您可以创建一个
    MemoryStream
    ProtoReader
    ,它占用更大的负载,但限制为虚拟长度。如果要发送多条消息,则需要知道有效负载的长度,这是不可避免的。这通常通过长度前缀实现。我希望这会抛出随机错误——很可能是“无效字段头0”——我想知道您是否接受了该异常
  • 没有具体的例子就无法评论;很可能与字段编号1的默认值有关(标题8==“字段1变量”)

  • 嗨,马克。谢谢你的及时回复。我能够识别C++和C语言数据之间的差异的根源。C++没有使用默认值填充EnUM字段。我更关心C#中的反序列化。我曾计划使用预分配的缓冲区重用同一个流,但它不起作用。现在,我必须分配新的字节数组以匹配消息中数据的大小,并将其传递给MemoryStream构造。我希望消息的发送率很高,我描述的解决方案将导致频繁的垃圾收集。我可以重用ProtoReader以避免额外的分配吗?