【问题标题】:How can I XML Serialize a Sealed Class with No Parameterless Constructor?如何在没有无参数构造函数的情况下对密封类进行 XML 序列化?
【发布时间】:2011-04-03 08:25:02
【问题描述】:

我目前正在使用XMLSerializer 来序列化我自己的一个类的列表。该类的属性之一是没有无参数构造函数的密封类的实例,因此 XML 序列化器拒绝序列化该类。我怎样才能解决这个问题?我需要序列化该属性。

我有什么方法可以指定该类应该如何序列化?

我们希望继续使用 XML;是否有另一个我可以使用的不会出现此问题的 XML 序列化程序?

再次,如果这是一个骗局,我深表歉意,但我不知道要搜索什么。

[编辑]澄清一下,我无权访问密封类的源代码。

【问题讨论】:

    标签: c# .net serialization xml-serialization sealed


    【解决方案1】:

    不能直接做; XmlSerializer 无法处理没有无参数构造函数的类。

    我通常做的是将无参数类包装在另一个与 XML 兼容的类中。包装类有一个无参数的构造函数和一组读写属性;它有一个FromXml 方法,可以调用真实类的构造函数。

    [XmlIgnore]
    public SomeClass SomeProperty { get; set; }
    
    [XmlElement("SomeProperty")]
    public XmlSomeClass XmlSomeProperty
    {
        get { return XmlSomeClass.ToXml(SomeProperty); }
        set { SomeProperty = value.FromXml(); }
    }
    

    【讨论】:

      【解决方案2】:

      你能做一个私有的无参数构造函数吗?假设您可以访问该类的代码,这将起作用。

      【讨论】:

      • 不幸的是,我无权访问源代码。它是 SDK 的一部分。
      • XmlSerializer 不会查看私人会员
      • 在这种情况下,我会尝试 Tim Robinson 的想法。那将是我的下一个建议:)
      【解决方案3】:

      您可以在包含类上实现ISerializable,然后实现自定义序列化器。

      【讨论】:

      • ISerializable 用于BinaryFormatter。甚至IXmlSerializable 也需要 ctor。
      • 啊。不知道二进制格式化程序。您不能使用自定义序列化器和反序列化器实现来包含密封对象的属性设置吗?
      • 不使用 XmlSerializer,不。除非你从头开始写。
      【解决方案4】:

      根据 xml 的复杂性,您可能DataContractSerializer 有一些运气。这不提供任何like 相同级别的 xml 控件,但它完全绕过了构造函数。并且适用于私有类型。

      我可能还会问:它真的需要是 xml 吗?对于 json 或 protobuf 等没有 XmlSerializer 限制的内容,还有其他序列化程序。

      【讨论】:

        【解决方案5】:

        使用IXmlSerializableXmlSerializer 太有限了。

        【讨论】:

        • IXmlSerializable 也需要一个无参数构造函数。
        猜你喜欢
        • 2013-09-07
        • 1970-01-01
        • 2010-10-10
        • 1970-01-01
        • 2010-09-12
        • 2012-12-06
        • 2013-01-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多