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 标记”。