使用Protobuf-Net,我发现似乎不可能在没有无参数构造函数的情况下反序列化一个类,或者我可能会错过某些东西?有没有无参数构造函数的类可以使用Protobuf-Net?
我不想要一些具有无参数构造函数的类。是否有某种属性可以使用或使用其他技术?
使用Protobuf-Net,我发现似乎不可能在没有无参数构造函数的情况下反序列化一个类,或者我可能会错过某些东西?有没有无参数构造函数的类可以使用Protobuf-Net?
我不想要一些具有无参数构造函数的类。是否有某种属性可以使用或使用其他技术?
protobuf-net目前依赖于具有无参数构造函数的工作。
但是这个构造函数不需要是公共的(it will use reflection if need be to invoke it),所以你可以定义所需的私有构造函数以供protobuf-net使用(添加一个关于为什么的注释)并处理那里的特定序列化相关问题。
这使得您的api的其余部分无法构建“非法”实例。
Marc指出,如果你在谈论最外层的消息对象,你也可以自己创建对象并调用Serializer.Merge。但是如果它需要创建一个对象(因为它目前有一个空实例,或者对于列表/数组中的新项目),那么它会查找默认的构造函数。
ShuggyCoUk使用无参数构造函数是正确的。
尽管如此 - 如果您正在讨论最外层的消息对象,您也可以自己创建对象并致电Serializer.Merge
。但是如果它需要创建一个对象(因为它当前有一个null
实例,或者对于列表/数组中的新项目),那么它会查找默认构造函数。
我想,我还可以提供的一些属性标记说“只是通过FormatterServices
创建一个原始对象”,但这种感觉不必要的(带私人参数的构造函数相比),并且可能无法在所有平台上工作(Silverlight,CF等 - 可能存在问题)。
我猜这是你已经做了什么('FormatterServices')与SkipConstructor选项,这些天可用? – DeCaf 2016-04-15 07:47:25
@DeCaf是的,就是这样 – 2016-04-15 12:04:54
何时调用无参数构造函数?其他字段更新之前? – mcmillab 2014-11-17 08:16:59