【发布时间】:2010-11-23 01:40:12
【问题描述】:
使用 Protobuf-Net,我发现在没有无参数构造函数的情况下似乎无法反序列化一个类,或者我可能遗漏了什么?
我不想要一些带有无参数构造函数的类。是否有一些我可以使用的属性或其他技术?
【问题讨论】:
标签: c# .net serialization protocol-buffers protobuf-net
使用 Protobuf-Net,我发现在没有无参数构造函数的情况下似乎无法反序列化一个类,或者我可能遗漏了什么?
我不想要一些带有无参数构造函数的类。是否有一些我可以使用的属性或其他技术?
【问题讨论】:
标签: c# .net serialization protocol-buffers 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)?