XMLDeserialize,“有一个反映类型的错误”

时间:2011-09-15 00:18:19

标签: c# reflection xml-serialization deserialization ixmlserializable

  

可能重复:
  XmlSerializer - There was an error reflecting type

XmlSerializer ser = new XmlSerializer(typeof(configType));
  

有一个错误反映了'MyNameSpace.configType'类型。

为了找到问题,我会在configType稍微削减一些。除了删除表面上冗余的属性之外,我从xsd.exe生成它后对它做的唯一更改是用我自己的类替换其中一个生成的类,所以我可以更好地实现可选元素的序列化。

感谢提示检查内部异常,它追溯到我创建的实现IXmlSerializable的类,它现在位于自己的文件中,如下所示:

using System;
using System.Text;
using System.Xml;
using System.Xml.Serialization;

namespace MyNameSpace
{
    [Serializable(), XmlType(Namespace = "MyNameSpace")] //Naughty xsd.exe!
    public class OpOpts : IXmlSerializable
    {
        void defaultFlags()
        {
            Opt1 = true;
            Opt2 = true;
            Opt5 = false;
        }

        public System.Xml.Schema.XmlSchema GetSchema() { return (null); }
        public void ReadXml(XmlReader reader)
        {
            defaultFlags();
            //            reader.Read();
            while (reader.NodeType != XmlNodeType.EndElement)
            {
                switch (reader.Name)
                {
                    case "Opt1": Opt1 = reader.ReadElementContentAsBoolean();
                        break;
                    case "Opt2": Opt2 = reader.ReadElementContentAsBoolean();
                        break;
                    case "Opt5": Opt5 = reader.ReadElementContentAsBoolean();
                        break;
                    default:
                        throw new Exception("Invalid XML tag " + reader.Name + " found under OpOpts.");
                }
            }
        }
        enum OptionEnum
        {
            Opt1, Opt2, Opt5
        }
        public void WriteXml(XmlWriter writer)
        {
            OpOpts defOpts = new OpOpts();
            if (Opt1 != defOpts.Opt1) writer.WriteElementString("Opt1", Opt1.ToString());
            if (Opt2 != defOpts.Opt2) writer.WriteElementString("Opt2", Opt2.ToString());
            if (Opt5 != defOpts.Opt5) writer.WriteElementString("Opt5", Opt5.ToString());
        }

        public bool Opt1 { get; set; }
        public bool Opt2 { get; set; }
        public bool Opt5 { get; set; }
    }
}

jdehaan写了一篇很好的文章Proper way to implement IXmlSerializable?。在阅读了他的代码项目后,我发现xsd.exe为我的proto-class生成的东西打破了我扩展到实现IXMLSerializable的类。

具体地,属性[XmlType(Namespace =“MyNameSpace”)]导致错误“反映属性”。当我删除它时,我得到了更多,包含类传递反序列化的所有其他内容,但当涉及到代表我上面的类的成员时,它会“无效的XML标记”。

0 个答案:

没有答案