【问题标题】:serialize only one property of a class只序列化一个类的一个属性
【发布时间】:2011-01-19 11:33:11
【问题描述】:

我有一个大约有 20 名成员的班级。我需要在 XML 中序列化这个类的对象。但条件是我只需要 XML 中的一个成员。

我该怎么做。

编辑:但有时,我想对所有成员进行序列化。所以我不能使用 [XMLIgnore] 属性。

【问题讨论】:

    标签: c# .net xml serialization


    【解决方案1】:

    为所有不想序列化的成员添加以下属性,

    [XmlIgnore()]
    public Type X
    {
    get;set;
    }
    

    【讨论】:

      【解决方案2】:

      您可以显式实现IXmlSerializable 接口并根据一些外部参数自行控制字段的读取/写入,即

      class CustomXml: IXmlSerializable
      {
          public System.Xml.Schema.XmlSchema GetSchema()
          {
              //
          }
      
          public void ReadXml(System.Xml.XmlReader reader)
          {
              if (SerializationParameter.FullSerialization)
                 //deserialize everything
              else
                 //deserialize one field only
          }
      
          public void WriteXml(System.Xml.XmlWriter writer)
          {
              if (SerializationParameter.FullSerialization)
                 //serialize everything
              else
                 //serialize one field only
          }
      }
      

      SerializationParameter.FullSerialization 是一个示例,说明如何控制何时序列化的内容。

      【讨论】:

        【解决方案3】:

        您可以将 [XmlIgnore] 属性放在您不想被序列化的所有成员上。

        【讨论】:

          【解决方案4】:

          有两种方法可以使用属性在 .NET 中使属性不可序列化。

          您可以设置属性[NonSerialized][XmlIgnore]

          如果你用二进制或 SOAP 序列化你应该使用[NonSerialized],如果你想只用 XML 序列化你应该使用[XmlIgnore]

          所以在你的情况下,答案是[XmlIgnore]

          编辑: 无法动态地将属性应用于属性。 这里有一些关于这里的信息:Can attributes be added dynamically in C#? 和这里 Remove C# attribute of a property dynamically

          此外,作为一项锻炼,您可能拥有具有不同属性的不同班级副本。

          有一个你的类的副本将所有道具设置为可序列化但只填充你需要的属性,这样其他所有东西都将为空/空,并且在该类的序列化之后你应该得到你需要的 XML。

          【讨论】:

            【解决方案5】:

            标记其他属性

            <NonSerializable()> _
            Property someproperty
            

            结束属性

            【讨论】:

              猜你喜欢
              • 2012-11-19
              • 1970-01-01
              • 1970-01-01
              • 2013-01-29
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-10-07
              相关资源
              最近更新 更多