使用Protobuf-Net,我发现如果没有无参数构造函数或者我可能会遗漏某些东西,似乎无法反序列化一个类?
我不希望某些类带有无参数构造函数。我可以使用某种属性或其他技术吗?
答案 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等 - 可能存在问题)。