如何找到我刚用protobuf-net反序列化的消息?

时间:2012-08-26 11:54:54

标签: c# protobuf-net

我很高兴在我的一些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));

从哪里来?如何判断消息是否包含Tile,Block或Map消息?

1 个答案:

答案 0 :(得分:3)

怎么样:

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

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

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

?实际上,如果这些选项是互斥的,那么这个场景也可以通过继承(对于相同的布局)在protobuf-net中建模 - 但是,因为.proto没有语法,你必须手动处理它。