XmlSerializer-反映類型錯誤

使用C#.NET 2.0,我有一個複合數據類,該類確實具備[Serializable]屬性。 我正在建立一個XMLSerializer類,並將其傳遞給構造函數: less

XmlSerializer serializer = new XmlSerializer(typeof(DataClass));

我正在說一個例外: ide

反映類型時發生錯誤。 函數

在數據類內部,還有另外一個複合對象。 這是否還須要具備[Serializable]屬性,或者將其放在頂部對象上,是否將其遞歸地應用於內部的全部對象? 編碼


#1樓

我發現.Net 2.0中的Dictionary類沒法使用XML進行序列化,可是在使用二進制序列化時能夠很好地進行序列化。 spa

我發現周圍的工做在這裏code


#2樓

我遇到了連續兩個元素的順序相同的狀況 orm

[System.Xml.Serialization.XmlElementAttribute(IsNullable = true, Order = 0, ElementName = "SeriousInjuryFlag")]

....一些代碼... 對象

[System.Xml.Serialization.XmlElementAttribute(IsNullable = true, Order = 0, ElementName = "AccidentFlag")]

當我更改代碼以將類中每一個新Property的順序遞增一時,錯誤消失了。 遞歸


#3樓

我最多見的緣由: 接口

- the object being serialized has no parameterless constructor
 - the object contains Dictionary
 - the object has some public Interface members

#4樓

若是須要處理特定的屬性(即Dictionary或任何類),則能夠實現IXmlSerialiable接口,這將使您擁有更多的自由,但須要付出更多的冗長編碼

public class NetService : IXmlSerializable
{
    #region Data

        public string Identifier = String.Empty;

        public string Name = String.Empty;

        public IPAddress Address = IPAddress.None;
        public int Port = 7777;

    #endregion

    #region IXmlSerializable Implementation

        public XmlSchema GetSchema() { return (null); }

        public void ReadXml(XmlReader reader)
        {
            // Attributes
            Identifier = reader[XML_IDENTIFIER];
            if (Int32.TryParse(reader[XML_NETWORK_PORT], out Port) == false)
            throw new XmlException("unable to parse the element " + typeof(NetService).Name + " (badly formatted parameter " + XML_NETWORK_PORT);
            if (IPAddress.TryParse(reader[XML_NETWORK_ADDR], out Address) == false)
            throw new XmlException("unable to parse the element " + typeof(NetService).Name + " (badly formatted parameter " + XML_NETWORK_ADDR);
        }

        public void WriteXml(XmlWriter writer)
        {
            // Attributes
            writer.WriteAttributeString(XML_IDENTIFIER, Identifier);
            writer.WriteAttributeString(XML_NETWORK_ADDR, Address.ToString());
            writer.WriteAttributeString(XML_NETWORK_PORT, Port.ToString());
        }

        private const string XML_IDENTIFIER = "Id";

        private const string XML_NETWORK_ADDR = "Address";

        private const string XML_NETWORK_PORT = "Port";

    #endregion
}

有一篇有趣的文章 ,它展現了一種實現「擴展」 XmlSerializer的複雜方法的優雅方法。


文章說:

IXmlSerializable包含在官方文檔中,但該文檔指出,該文檔僅供公衆使用,不提供任何其餘信息。 這代表開發團隊但願保留修改,禁用甚至徹底刪除此可擴展性的權利。 可是,只要您願意接受這種不肯定性並應對未來可能發生的變化,就沒有任何理由不能利用它。

所以,我建議您實現本身的IXmlSerializable類,以免過多的實現。

...使用反射實現自定義XmlSerializer類可能很簡單。


#5樓

[System.Xml.Serialization.XmlElementAttribute(「 strFieldName」,Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]

//要麼

[XmlIgnore]字符串[] strFielsName {get; set;}

相關文章
相關標籤/搜索