.NET にはいくつかの (たくさんの) クラスがありました。protobuf-netを使用してそれらをマークアップし、 Google オリジナル ライブラリを介して C++ コード側の .proto ラッパーを生成しました。
だから私はメッセージを持っています (いくつかの EventBase クラスに C++ DebugString() があります (.NET ではEventCharacterMoved
継承されますEventBase
が、C++ ではオプションのプロパティに書き込むだけです)):
UserId: -2792
EventCharacterMoved {
Coordinates {
Position {
X: 196.41913
Y: 130
Z: 213
}
Rotation {
X: 207
Y: 130
Z: 213
}
}
OldCoordinates {
Position {
X: 196.41913
Y: 130
Z: 213
}
Rotation {
X: 207
Y: 130
Z: 213
}
}
}
(そのような .proto ファイルから)
message Coordinates {
optional TreeFloat Position = 1;
optional TreeFloat Rotation = 2;
}
message EventBase {
optional int32 UserId = 10 [default = 0];
// the following represent sub-types; at most 1 should have a value
optional EventCharacterMoved EventCharacterMoved = 15;
}
message EventCharacterMoved {
optional Coordinates Coordinates = 100;
optional Coordinates OldCoordinates = 101;
}
message TreeFloat {
optional float X = 1 [default = 0];
optional float Y = 2 [default = 0];
optional float Z = 3 [default = 0];
}
C++ ではこれを送信し、同じメッセージ コンテンツを .NET から送信します。
C++ コードは、C++ でエンコードされたメッセージと .NET でエンコードされたメッセージを解析できます。.NET コードは、.NET メッセージのみを解析できます。
ネットワーク経由で 87 バイトが飛んでいます ( .Net ファイルとC++ ファイルのサイズは同じです) が、内容は異なります。
ご覧のとおり、似ていますが同じではありません。このような違いの結果、CPP コードは .NET C# メッセージを読み取ることができますが、.NET は CPP メッセージを読み取ることができません。
逆シリアル化のコードでは、次のようになります。
TestProto.exe で、タイプ 'System.InvalidCastException' の未処理の例外が発生しました
追加情報: タイプ 'TestProto.EventBase' のオブジェクトをタイプ 'TestProto.EventCharacterMoved' にキャストできません。
次のようなコードで:
using (var inputStream = File.Open(@"./cpp_in.bin", FileMode.Open, FileAccess.Read)) {
var ecm = Serializer.Deserialize<EventCharacterMoved>(inputStream);
}
(彼のコメントでjpaが述べたように)オプションを見てみましょうprotoc --decode_raw
:
これは、私の CPP ラッパーが最新の Google protobuf バージョンを使用しているのに対し、protobuf-net はおそらく古いエンコーディング形式またはこのようなものを使用しているという事実に関連している可能性があります...
では、.NET protobuf に C++ メッセージを読み取らせる方法 (tham が同じ内容をデコードできるようにする方法) を知りたいのですが。
または、少なくとも元の Google protobuf を .NET protobuf と同じ方法でエンコードする方法は?
そして、本当に興味があり、簡単な例を含む圧縮バンドル (C++ および C# コード用の VS 2010 ソリューションが含まれています)を取得したい人のために