【问题标题】:Is it possible to use Protobuf-Net with a class without a parameterless constructor?是否可以将 Protobuf-Net 与没有无参数构造函数的类一起使用?
【发布时间】:2010-11-23 01:40:12
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 什么时候调用无参构造函数?在其他字段更新之前?
    【解决方案2】:

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

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

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

    【讨论】:

    • 我猜这就是您最近使用 SkipConstructor 选项所做的 (FormatterServices)?
    • @DeCaf 是的,它就是这样做的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多