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

时间:2010-03-11 09:56:42

标签: 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;
}

我的目标是将其序列化并将其作为单个样本注入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 ++中反序列化?)

非常感谢。

Roey

1 个答案:

答案 0 :(得分:1)

嗯...那里我唯一可能期待凌乱的是Guid(我最近意识到我的编码似乎是相当疯狂的结尾)。所以我认为应该正常工作,提供或采取一些混乱的代码来破译Guid

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

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

然后:

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

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

另外 - 检查您是否使用GetBuffer()(或至少,如果您 使用GetBuffer(),请确保使用.Length中的MemoryStream byte[],而不是来自超大{{1}})。