Protobuf多个对象序列化顺序?

时间:2018-06-10 18:11:26

标签: protobuf-net

我正在构建一个套接字服务器 - 客户端应用程序,我正在使用protobuf-net来序列化/反序列化从一个发送到另一个的数据。现在我发送一个对象和接收器,根据数据包的标题我知道我想接收和反序列化。我想知道是否可以将多个对象作为object []发送,其中包含不同的类型,序列化和反序列化,与阵列上对象的顺序无关?我假设这意味着数组中的每个对象都应该有一个序列化的类型标识符,因此在反序列化时我知道它是哪个对象。另外,一个变量标识符(如变量名),因此具有相同类型的多个对象可以是不同的。

我认为最简单的方法是始终将我的数据包装在一个对象中,并将所有数据作为属性。只是想知道这是否可行,因为这将使我的代码更容易,不必创建所有这些包装类。

1 个答案:

答案 0 :(得分:0)

object非常尴尬,因为引擎无法知道你的意图。 在protobuf-net中加入的一些动态类型的东西,嵌入了AQN类型,但坦率地说这是一个巨大的黑客攻击。到目前为止,您最好的选择是限制自己使用一些有限的继承模型。例如:

[ProtoContract]
[ProtoInclude(1, typeof(Foo)]
[ProtoInclude(2, typeof(Bar)]
public class MessageBase {}

[ProtoContract]
public class Foo : MessageBase {}

(类似地Bar

然后发送MessageBase[]并使用Deserialize(或DeserializeWithLengthPrefix)指定<MessageBase>。每条消息都将作为正确的类型发送和检索,允许使用多态或新的switch模式匹配来路由传入的消息,并且没有歧义。

在幕后,这实现就像(在.proto术语中):

message MessageBase {
    oneof ActualType {
        Foo foo = 1;
        Bar bar = 2;
    }
}
message Foo {}
message Bar {}