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) {
    // ...
}

? Actually, if these options are mutually exclusive, this scenario could also be modelled in protobuf-net via inheritance (for the same layout) - however, since .proto has no syntax for that you would have to handle that manually.

于 2012-08-27T15:57:49.960 回答