C# protobuf-net-在C++;一方:(

C# protobuf-net-在C++;一方:(,c#,c++,protocol-buffers,protobuf-net,C#,C++,Protocol Buffers,Protobuf Net,我在.Net应用程序中使用ProtoBuf Net来序列化以下内容:(以.proto格式) 我的目标是将其序列化,并将其作为单个示例注入ASF文件中 我称之为序列化: MemoryStream ms = new MemoryStream(); Serializer.Serialize<ProtoScreenBuffer>(ms, ProtoScreenBuffer.CreateProtoScreenBuffer (buffer)); 我把这个字节数组放在ASF中。最大的问题是在我的

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

我的目标是将其序列化,并将其作为单个示例注入ASF文件中

我称之为序列化:

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

我把这个字节数组放在ASF中。最大的问题是在我的C++应用程序上,它读取ASF样本很好,当我尝试反序列化时,它会遇到内存访问违规:(

这是我的C++代码:

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

我在做的任何事情都是错误的,我正在做的事情(在C++中被序列化,在C++中反序列化)? 非常感谢


Roey

嗯……这里唯一让我感到混乱的是
Guid
(我最近意识到我对它的编码似乎是相当疯狂的endian)。所以我认为这应该可以很好地工作,使用一些混乱的代码来破译
Guid

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

  • 通过C#将数据序列化为文件(或者只查看调试器屏幕上的字节)
  • 通过C++将/Asvest/Advices序列化到文件(或者只需查看调试器中的屏幕上的字节)
然后:

  • 比较字节
  • 检查长度是否符合您的预期(即您要传递的号码)
这应该表明是编码,还是与传递错误的内存地址或类似内容有关


另外-检查您没有使用
GetBuffer()
(或者至少,如果您使用
GetBuffer()
,请确保使用
内存流中的
.Length
,而不是过大的
字节[]
)出于兴趣,你尝试过用java反序列化,还是用C++的端口代替了?这将给出关于它是C++还是原Buffnet的问题的一些提示。我的代码使用C的端口有多大的努力?嗨,乔恩,我不能用PrimeG.EXE创建代码。我得到了一个例外:错误:协议消息EN。d-group标记与预期的标记不匹配。这是为什么?只是为了确认;最后一行与@Jon的protogen相关,而不是我的?嗨,Marc,感谢您的回复,GUID基本上是:消息GUID{optional fixed64 lo=1;//GUID的前8个字节optional fixed64 Hi=2;//GUID的第二个8个字节}我会试着比较这两个…谢谢,有点混乱。我的意思是GUID是你几天前给我的格式,我会尝试比较C和C++版本:谢谢,我比较了我在.NET应用程序中所序列化的内容和我在C++应用程序中试图反序列化的内容,它们是100%相同的,我也删除了GUI参数。当谷歌原始Fuffs C++试图解码“数据”时,似乎发生了访问冲突。你喜欢我在其他地方启动一个线程来讨论这个问题吗?我很高兴输出是相同的。这会改变负担;-P我认为C++问题的最佳位置是在这里:你将寻找Kuton瓦尔达的回复。我能肯定100%,原BoFF网络正确地序列化了我的数据吗?应该是“字节”吗?字段有长度吗?或者它会序列化我给它的任何长度吗?
ms.ToArray();
m_screenBuffer.ParseFromArray(serBuffer, dwInputDataLen);