是否可以将Protobuf-Net与没有无参数构造函数的类一起使用?

时间:2009-08-26 15:45:50

标签: c# .net serialization protocol-buffers protobuf-net

使用Protobuf-Net,我发现如果没有无参数构造函数或者我可能会遗漏某些东西,似乎无法反序列化一个类?

我不希望某些类带有无参数构造函数。我可以使用某种属性或其他技术吗?

2 个答案:

答案 0 :(得分:13)

protobuf-net目前依赖于无参数构造函数。

然而,该构造函数不需要是公共的(it will use reflection if need be to invoke it),因此您可以定义所需的私有构造函数,仅供protobuf-net使用(添加注释以了解原因)并处理特定的序列化相关问题那里。

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

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

答案 1 :(得分:4)

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

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

假设我还可以在属性中提供一些标记来说“只需通过FormatterServices创建一个原始对象”,但这种做法感觉不必要(与私有无参数构造函数相比) ,并且可能无法在所有平台上运行(Silverlight,CF等 - 可能存在问题)。