簡體   English   中英

C# - 屬性的 XML 反序列化

[英]C# - XML Deserialization of properties

我找不到沒有 getter 的屬性不能正確解析的原因,讓我給你寫一個例子:

對於格式的 XML

<request>
  <job 
     mode="modefirst"
  />
<request>

我正在嘗試將其反序列化為具有屬性的 POCO:

    private ESomeEnum emode;

    [XmlAttribute(AttributeName = "mode")]
    public string Mode
    {
       set { ESomeEnum.TryParse( blah blah );
    }

emode 被設置為類構造函數中的默認值,同時反序列化(System.Xml.Serialization 沒有自定義類,只是試圖在此處保持簡約)上面的 xml,永遠不會調用 setter,但是當屬性“Mode”包含吸氣劑

    get { return this.emode.ToString(); }

setter 實際上是在反序列化過程中被命中並設置了正確的值。

為什么會出現這種情況? 這背后有什么原因嗎?

XmlSerializer僅處理具有公共 get-set 訪問器的屬性。 但是你可以通過實現IXmlSerializable定義任何東西:

public class MyXmlSerializableClass : IXmlSerializable
{
    private ESomeEnum emode = ESomeEnum.modefirst;

    public string Mode
    {
        set { emode = ESomeEnum.Parse(value); }
    }

    public int ReadWriteProperty { get; set; }

    public int SemiReadOnlyProperty { get; private set; }

    private int backingFieldOfRealReadOnlyProperty;
    public int RealReadOnlyProperty
    {
        get { return backingFieldOfRealReadOnlyProperty; }
    }

    #region IXmlSerializable Members

    public System.Xml.Schema.XmlSchema GetSchema()
    {
        throw new NotImplementedException();
    }

    public void ReadXml(XmlReader reader)
    {
        if (reader.Settings != null && !reader.Settings.IgnoreWhitespace)
        {
            reader = XmlReader.Create(reader, new XmlReaderSettings { IgnoreWhitespace = true });
            reader.Read();
        }

        reader.ReadStartElement();
        Mode = reader.ReadElementContentAsString("Mode", String.Empty);
        ReadWriteProperty = reader.ReadElementContentAsInt("ReadWriteProperty", String.Empty);
        SemiReadOnlyProperty = reader.ReadElementContentAsInt("ReadOnlyAutoProperty", String.Empty);
        backingFieldOfRealReadOnlyProperty = reader.ReadElementContentAsInt("ReadOnlyProperty", String.Empty);
    }

    public void WriteXml(XmlWriter writer)
    {
        writer.WriteElementString("Mode", emode.ToString());
        writer.WriteElementString("ReadWriteProperty", ReadWriteProperty.ToString(CultureInfo.InvariantCulture));
        writer.WriteElementString("ReadOnlyAutoProperty", SemiReadOnlyProperty.ToString(CultureInfo.InvariantCulture));
        writer.WriteElementString("ReadOnlyProperty", RealReadOnlyProperty.ToString(CultureInfo.InvariantCulture));
    }

    #endregion

    internal MyXmlSerializableClass()
    {/*needed for deserialization*/
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM