首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Protobuf-net sirialization/反序列化c# vs Linux c++

Protobuf-net sirialization/反序列化c# vs Linux c++
EN

Stack Overflow用户
提问于 2014-11-04 03:39:35
回答 1查看 396关注 0票数 1

我正在通过C#套接字在和之间传递消息。C#代码使用了Linux版本的protobuf-net v2。我传递的小测试对象有6个字段( Enum、Int、String)。我需要帮助解决两个问题:

  1. C#部分无法反序列化从Linux发送的数据,除非使用构造函数中的二进制数组初始化用作数据存储的内存流。数组不能大于从Linux发送的数据(在我的例子中是9个字节)。代码示例- byte[] data =新byte9,将数据从套接字复制到数组中。MemoryStream myStream =新MemoryStream(数据),将myStream传递给Serializer.Deserialize.如果不使用二进制缓冲区或1024字节数组初始化MemoryStream,反序列化将创建空对象,而不处理数据。
  2. 在C#中,当我尝试用与Linux相同的值序列化相同的对象时,数据的大小在Linux上是11字节对9字节。我在调试器中检查了字节数组,C#版本在数组的索引2-11中有与Linux数据相同的9个字段。索引0是8,索引1是9。我可以尝试通过修改Linux反序列化代码来解决这个问题,只需要知道,在消息开始时是否总是需要处理两个额外的字段。此外,如果要修复C#中的反序列化,我可以向在Linux上生成的消息添加两个额外的字段,只需要知道如何为这两个字段生成值。

谢谢。亚历克斯。

EN

回答 1

Stack Overflow用户

发布于 2014-11-04 09:20:47

  1. Protobuf数据并不是简单的自我终止。但是,您可以创建一个MemoryStreamProtoReader,它需要更大的有效负载,但仅限于虚拟长度。如果要发送多条消息,则需要知道有效负载的长度--这是不可避免的。这通常是通过长度前缀实现的。我预计这会抛出随机错误--很可能是“无效字段头0”--我想知道您是否正在吞服该异常。
  2. 如果没有特定的示例,就不可能进行注释;很可能与字段号1的默认值(头8 ===“字段1 varint")有关。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26727340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档