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

标签 c# c++ protocol-buffers protobuf-net

我在我的 .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;
}

我的目标是将其序列化并将其作为单个样本注入(inject) 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++ 中反序列化),我在这里做的任何事情是否有误?

非常感谢。

罗伊

最佳答案

嗯...我可能认为其中唯一困惑的是 Guid(我最近意识到我对此的编码似乎相当疯狂)。所以我认为应该可以正常工作,提供或使用一些困惑的代码来破译 Guid

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

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

然后:

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

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

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

关于c# - protobuf-net - 在 C++ 端反序列化的问题 :(,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2423974/

相关文章:

c# - 基类包含字段 'btnLogin' ,但其类型 (FoodOrder.App_Code.LinkBut​​tonDefault) 不兼容

c++ - 虚拟析构函数仅在选定的基地

go - 编译 Protocol Buffer :Missing output directives

protocol-buffers - protobuf 消息中的最大字段数

c# - 使用 OleDB 读取 CSV 数据的文件访问错误

c# - 我应该触发触发器以从有限状态机中的 OnEntry() 方法更改状态吗?

c# - 如何在将值添加到 asp.net 之前检查列表框中是否已经存在

c++ - 通过并行处理在二维数组中找到最大值及其坐标

c++ - 在 Ubuntu 17.10 中从 C/C++ 源构建 Tensorflow 1.4.0

Java Protobuf(版本 2.4.1)和 Protobuf-net(版本 r480)继承兼容性