2

可能重复:
XmlSerializer - 反映类型时出现错误

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

反映类型“MyNameSpace.configType”时出现错误。

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

感谢您提供检查该 innerException 的提示,它可以追溯到我实现 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 为我的原型类生成的东西破坏了我扩展实现的类IXMLSerializable

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

4

0 回答 0