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;}

相关文章
相关标签/搜索