重複の可能性:
XmlSerializer-タイプを反映するエラーがありました
XmlSerializer ser = new XmlSerializer(typeof(configType));
タイプ「MyNameSpace.configType」を反映するエラーがありました。
configType
問題を見つけることを期待して、もう少し詳しく説明します。表面上冗長な属性を削除する以外に、xsd.exeから生成した後に行った唯一の変更は、生成されたクラスの1つを自分のものに置き換えることでした。これにより、オプションの要素のシリアル化をより適切に実装できます。
その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は素晴らしい記事を書きました。IXmlSerializableを実装する適切な方法は?。彼のコードプロジェクトを読んだ後、xsd.exeがプロトクラス用に生成したものが、実装するために拡張したクラスを壊していることがわかりましたIXMLSerializable
。
具体的には、属性[XmlType(Namespace = "MyNameSpace")]により、「プロパティの反映」というエラーが発生します。それを削除すると、もう少し進んで、含まれているクラスは他のすべての逆シリアル化を渡しますが、上記のクラスを表すメンバーに関しては「無効なXMLタグ」と叫びます。