Protobuf 无法序列化 system.object

问题描述

我的类具有序列化所需的所有属性,我将它们存储在 system.object 中,以便当另一端反序列化它们时,它可以模式匹配它们并根据对象类型执行不同的操作。

object data = MyObject;
Serializer.SerializeWithLengthPrefix(stream,data,PrefixStyle.Fixed32); // exception happens here

使用其他序列化方法(如 XML/BinaryFormatter)尝试过,似乎没有问题。

解决方法

这里的异常非常具有描述性 - protobuf-net 无法序列化 system.object,因为它还没有被告知如何序列化/反序列化它。这不是 protobuf-net 的限制,protobuf(规范)是一种契约序列化方法,因此它需要类型规范才能序列化。

一种选择是创建一个用 ProtoContract 属性标记的基类并从那里继承。一定要使用 ProtoInclude-attribute 包含基类中的所有子类,否则序列化器将不知道如何序列化子类。

我建议不要这样做,因为子类的序列化是 protobuf-net 在标准 protobuf 行为之上提供的一种添加,如果您需要使用其他库和/或语言,则会产生问题。相反,我建议您创建一种消息格式,您可以在其中单独对对象的类型进行编码(protobuf 术语中的消息)。例如,将类型编码为 enum 作为消息开头的前 4 个字节,然后是对象本身。然后你可以先读取类型,然后相应地反序列化,而不必求助于子类。