3

私はしばらくの間、いくつかのC++アプリケーション間でprotobuf+ZeroMQをうまく使用してきました。C#アプリケーションを作成する必要があります。Protobuf-NETが機能していて、ZeroMQメッセージから逆シリアル化する方法がついにわかったと思いますが、逆シリアル化されたデータにどのメッセージが含まれているかを確認する方法を一生理解できません。私のC++アプリケーションでは、クラスに逆シリアル化し、次のことを簡単に行うことができました。

if(msg.has_msgTypeX())
    blah

Protobuf-NETでこれを行う方法がわかりません。

サンプル.protoファイル:

package Messaging;

message Message {
    optional string uuid                = 1;

    optional Map map                = 2;
    optional Block block                = 3;
    optional Tile tile              = 4;
}

message Map {
    repeated Block block        = 1;
}

message Block {
    repeated Tile   tile            = 1;
    required int32 zCoord           = 2;
    required int32 version          = 3;
}

message Tile {
    required int32 xGCoord          = 1;
    required int32 yGCoord          = 2;
    required int32 zGCoord          = 3;
}

これを使用して逆シリアル化します。

Messaging.Message msg = ProtoBuf.Serializer.Deserialize<Messaging.Message>(new MemoryStream(zmqMsg.Body));

ここからどこへ?メッセージにタイル、ブロック、またはマップメッセージが含まれているかどうかを確認するにはどうすればよいですか?

4

1 に答える 1

3

どうですか:

if(msg.map != null) {
    // ...
}

if(msg.block != null) {
    // ...
}

if(msg.tile != null) {
    // ...
}

? 実際、これらのオプションが相互に排他的である場合、このシナリオは継承を介して (同じレイアウトに対して) protobuf-net でモデル化することもできますが、.proto にはそのための構文がないため、手動で処理する必要があります。

于 2012-08-27T15:57:49.960 に答える