2

.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 に入れます。大きな問題は、ASF サンプルを正常に読み取る C++ アプリにあります。逆シリアル化しようとすると、メモリ アクセス違反が発生します :(

これは私のC++コードです:

m_screenBuffer.ParseFromArray(serBuffer, dwInputDataLen); 

(ここで、m_screenBuffer は ProtoScreenBuffer、serBuffer は ASF ファイルから取得した生のバイト配列、dwInputDataLen はその長さです。)

私がやろうとしていることに対して、ここで間違っていることはありますか (C# .NET でシリアル化し、C++ で逆シリアル化しますか?)

どうもありがとう。

ローイ

4

1 に答える 1

1

うーん...私が面倒だと思うかもしれない唯一のものはGuid(私は最近、これの私のエンコーディングがかなり狂ったように見えることに気づきました)。だから私はそれがうまくいくはずだと思うGuid.

エンコーディングエラーを除外するために、私が提案するのは次のとおりです。

  • C# 経由でデータをファイルにシリアル化します (または、デバッガーで画面上のバイトを確認します)。
  • /same/ データを C++ 経由でファイルにシリアル化します (または、デバッガーで画面上のバイトを確認します)。

それで:

  • バイトを比較する
  • 長さが期待どおりであることを確認します(つまり、通過している数)

これは、それがエンコーディングであるか、間違ったメモリアドレスなどを渡すことに関係しているかを示す必要があります。

また、使用していないことを確認してくださいGetBuffer()(少なくとも、使用する場合、特大のものではなく、からGetBuffer()使用していることを確認してください)。.LengthMemoryStreambyte[]

于 2010-03-11T11:07:23.993 に答える