【问题标题】:XmlSerializer with parameterless constructor with no public properties or fields... Is it possible?XmlSerializer 具有无参数构造函数,没有公共属性或字段......有可能吗?
【发布时间】:2009-06-30 20:25:05
【问题描述】:

具有以下类(.Net 3.5):

public class Something
{
    public string Text {get; private set;}

    private Something()
    {
        Text = string.Empty;
    }

    public Something(string text)
    {
        Text = text;
    }
}

这序列化没有错误,但生成的 XML 不包含 Text 属性,因为它没有公共设置器。

有没有办法(越简单越好)让 XmlSerializer 包含这些属性?

【问题讨论】:

    标签: c# .net xml-serialization


    【解决方案1】:

    XmlSerializer 只关心公共读/写成员。一种选择是实现IXmlSerializable,但这是大量的工作。更实用的选择(如果可用且合适)可能是使用DataContractSerializer

    [DataContract]
    public class Something
    {
        [DataMember]
        public string Text {get; private set;}
    
        private Something()
        {
            Text = string.Empty;
        }
    
        public Something(string text)
        {
            Text = text;
        }
    }
    

    这对public和private成员都有效,但是生成的xml不太一样,不能指定xml属性。

    【讨论】:

    • 谢谢 Marc,这可行,我不知道这个属性。您提到的两个缺点是它们唯一的缺点还是还有其他问题?
    • 在许多方面,它是一个 /better/ 序列化程序(你希望如此,因为它是较新的) - 但它有不同的目标。如果您需要严格控制 xml,它就不那么灵活了。但是如果你只是想让你的数据序列化,那么它应该可以工作。或者试试 protobuf-net ;-p
    • 请注意,您需要添加对 System.Runtime.Serialization 的引用(来自 .NET 3.0)
    【解决方案2】:

    没有。 XML 序列化只会序列化对象的公共读/写字段和属性。

    【讨论】:

      【解决方案3】:

      尝试

      [可序列化] 公共课的东西 { ... }

      【讨论】:

      • XmlSerializer 不需要 [Serializable],它对让您序列化只读成员完全没有任何作用。
      • 有时需要[Serializable]。
      • @Henk: 什么时候需要[Serializable]?
      • 不,抱歉,我以为这是关于 SOAPFormatter 的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-08
      • 1970-01-01
      • 2023-01-01
      • 2012-10-21
      • 2013-07-10
      • 1970-01-01
      • 2013-07-05
      相关资源
      最近更新 更多