11

使用 Protobuf-Net,我发现在没有无参数构造函数的情况下似乎无法反序列化一个类,或者我可能遗漏了什么?

我不想要一些带有无参数构造函数的类。是否有某种我可以使用的属性或其他一些技术?

4

2 回答 2

13

protobuf-net 目前依赖于有一个无参数的构造函数来工作。

但是,该构造函数不必是公共的(如果需要调用它,它将使用反射),因此您可以定义所需的私有构造函数,仅供 protobuf-net 使用(添加关于原因的注释)并处理特定的序列化那里的相关问题。

这使您的 api 的其余部分无法构造“非法”实例。

Marc 指出,如果您在谈论最外层的消息对象,您也可以自己创建对象并调用 Serializer.Merge。但是如果它需要创建一个对象(因为它当前有一个空实例,或者对于列表/数组中的新项目),那么它会寻找一个默认构造函数。

于 2009-08-26T18:11:26.717 回答
4

ShuggyCoUk 使用无参数构造函数是正确的。

不过,为了完整起见 - 如果您正在谈论最外层的消息对象,您也可以自己创建对象并调用Serializer.Merge. 但是如果它需要创建一个对象(因为它当前有一个null实例,或者对于列表/数组中的新项目),那么它会寻找一个默认构造函数。

我也可以在属性中提供一些标记来表示“只需通过FormatterServices”创建一个原始对象,但这感觉没有必要(与私有无参数构造函数相比),并且可能不适用于所有平台(Silverlight、CF 等 -是可能的问题)。

于 2009-08-27T09:57:09.200 回答