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