protobuf-net - 在 C++ 端反序列化的问题:(

Posted

技术标签:

【中文标题】protobuf-net - 在 C++ 端反序列化的问题:(【英文标题】:protobuf-net - problem with deserializing on C++ side :( 【发布时间】:2010-03-11 09:56:41 【问题描述】:

我在我的 .NET 应用程序中使用 ProtoBuf-Net 来序列化以下内容:(以 .proto 格式)

message ProtoScreenBuffer 
optional int32 MediaId = 1;
optional bytes Data = 2;
optional bool LastBuffer = 3;
optional int64 StartTime = 4;
optional int64 StopTime = 5;
optional int32 Flags = 6;
optional int32 BufferSubType = 7;
optional int32 BufferType = 8;
optional Guid Guid = 9;
repeated int32 EncryptedDataStart = 10;
repeated int32 EncryptedDataLength = 11;

我的目标是将其序列化并将其作为单个样本注入 ASF 文件。

我称之为序列化:

MemoryStream ms = new MemoryStream();
Serializer.Serialize<ProtoScreenBuffer>(ms, ProtoScreenBuffer.CreateProtoScreenBuffer (buffer));

然后我从 ms 对象中得到一个字节数组:

ms.ToArray();

然后我将这个字节数组放入 ASF。最大的问题是我的 C++ 应用程序可以很好地读取 ASF 示例,当我尝试反序列化它时遇到内存访问冲突:(

这是我的 C++ 代码:

m_screenBuffer.ParseFromArray(serBuffer, dwInputDataLen); 

(其中 m_screenBuffer 是 ProtoScreenBuffer,serBuffer 是我从 ASF 文件中得到的原始字节数组,dwInputDataLen 是它的长度。)

对于我正在尝试做的事情,我在这里做的任何事情都是错误的吗(在 C# .NET 中序列化并在 C++ 中反序列化?)

非常感谢。

罗伊

【问题讨论】:

出于兴趣,您是否尝试过在 Java 中反序列化,或者使用我的 C# 端口来反序列化?这将给出一些迹象,表明是 C++ 还是 protobuf-net 导致了问题。 移植我的代码以使用您的 C# 端口需要付出多少努力? 嗨 Jon,我无法使用 protogen.exe 创建代码。我得到一个异常:错误:协议消息结束组标记与预期标记不匹配。这是为什么? 只是为了确认;最后一行与@Jon 的原型有关,不是我的? 【参考方案1】:

嗯...我可能认为那里唯一会乱七八糟的是Guid(我最近意识到我的编码似乎是相当疯狂的字节序)。所以我认为应该可以正常工作,提供或获取一些杂乱的代码来破译Guid

为了排除编码错误,我的建议是:

通过 C# 将数据序列化到文件中(或者只是在调试器中查看屏幕上的字节) 通过 C++ 将 /same/ 数据序列化到一个文件中(或者只是在调试器中查看屏幕上的字节)

然后:

比较字节 检查长度是否符合您的预期(即您传递的数字)

这应该表明它是否是编码,与传递错误的内存地址或类似的东西有关。

另外 - 检查你没有使用GetBuffer()(或者至少,如果你确实使用GetBuffer(),请确保你使用MemoryStream中的.Length,而不是来自超大号byte[])。

【讨论】:

嗨 Marc,感谢您的回复,GUID 基本上是:message Guid optional fixed64 lo = 1; // guid 的前 8 个字节 可选 fixed64 hi = 2; // guid 的第二个 8 字节 我将尝试比较两者.. 谢谢 结果有点乱。我的意思是 GUID 是你几天前给我的格式,我会尝试比较 C# 和 C++ 版本:) 谢谢 Marc,我比较了我在 .NET 应用程序中序列化的内容和我尝试在 C++ 应用程序中反序列化的内容,它们是 100% 相同的,并且我还删除了 GUI 参数。当 google protobuffs c++ 试图解码“数据”字段时,似乎发生了访问冲突。你愿意我在其他地方开个帖子讨论这个吗? 我很高兴输出是相同的。这转移了负担;-p 我认为解决 C++ 问题的最佳地点是:groups.google.com/group/protobuf/topics,您将寻找 Kenton Varda 的回复。 我可以 100% 确定 protobuf-net 正确序列化我的数据吗? “字节”字段应该有长度吗?还是会序列化我给它的任何长度?

以上是关于protobuf-net - 在 C++ 端反序列化的问题:(的主要内容,如果未能解决你的问题,请参考以下文章

Protobuf-net 使用嵌套数据反序列化时出现无效的线型异常(C++ 到 C#)

Protobuf-net 应用

仅在 ProtoBuf-net 中序列化基类

在 protobuf-net 中序列化 IEnumerable

NEventStore 3+ 的 Protobuf-net 序列化程序

protobuf-net 反序列化错误 无效标签:0