タイプが列のカスタム mylist、つまり Microsoft.SqlServer.Management.smo.Column をシリアル化するときにエラーが発生します。これをシリーズ化する方法がわかりません。
次のようにクラスをシリアル化しました。
ValidationClass validation = new ValidationClass();
XmlSerializer serializer = new XmlSerializer(typeof(ValidationClass));
TextWriter writer = new StreamWriter(@"D:\xml doc\AspxGenerator.xml");
serializer.Serialize(writer, validation);
writer.Close();
このために書かれた検証クラスは次のとおりです。
[Serializable]
public class ValidationClass
{
public bool IsNotNull { get; set; }
public bool IsEmail { get; set; }
public MyList<MyTable> MaxLimit { get; set; }
public int MinLimit { get; set; }
public bool IsValidDate { get; set; }
public SerializableDictionary<int, string> PropertyNames;// { get; set; }
public ValidationClass()
{
PropertyNames = new SerializableDictionary<int,string>();
PropertyNames.Add(0, "A");
PropertyNames.Add(1, "B");
PropertyNames.Add(2, "C");
MaxLimit = new MyList<MyTable>();
MyTable a = new MyTable();
MyTable b = new MyTable();
MaxLimit.Add(a);
MaxLimit.Add(b);
//MaxLimit = new MyList<int>();
//MaxLimit.Add(0);
//MaxLimit.Add(2);
}
}
また、MyList は次のように実装されます。
[XmlRoot("dictionary")]
public class MyList<Tkey> : List<Tkey>, IXmlSerializable
{
#region IXmlSerializable Members
public System.Xml.Schema.XmlSchema GetSchema()
{
return null;
}
public void ReadXml(System.Xml.XmlReader reader)
{
XmlSerializer keySerializer = new XmlSerializer(typeof(Tkey));
bool wasEmpty = reader.IsEmptyElement;
reader.Read();
if (wasEmpty)
return;
while (reader.NodeType != System.Xml.XmlNodeType.EndElement)
{
reader.ReadStartElement("item");
reader.ReadStartElement("key");
Tkey key = (Tkey)keySerializer.Deserialize(reader);
reader.ReadEndElement();
this.Add(key);
reader.ReadEndElement();
reader.MoveToContent();
}
reader.ReadEndElement();
}
public void WriteXml(System.Xml.XmlWriter writer)
{
XmlSerializer keySerializer = new XmlSerializer(typeof(Tkey));
foreach (Tkey key in this)
{
writer.WriteStartElement("item");
writer.WriteStartElement("key");
keySerializer.Serialize(writer, key);
writer.WriteEndElement();
writer.WriteEndElement();
}
}
#endregion
}
これを実行した後、エラーが発生しました:「タイプ 'Microsoft.SqlServer.Management.Smo.Column' を反映するエラーが発生しました。」
内部例外: "{"XML シリアル化可能にするには、ICollection から継承する型に、継承階層のすべてのレベルで Add(Microsoft.SqlServer.Management.Smo.Property) の実装が必要です。Microsoft.SqlServer.Management.Smo.SqlPropertyCollection は Add(Microsoft.SqlServer.Management.Smo.Property) を実装していません。"}"
IXmlSerilzable の実装は完璧で、問題はありません。問題は、私が使用した型、つまり Microsoft.SqlServer.Management.smo.Column にあります。「列」タイプを「文字列」タイプに置き換えてこのコードをチェックしたところ、完全に機能しました。またクラス欄は封印クラスです。
ValidationClass をシリアライズしたいのですが、その方法を提案してください。
よろしくお願いします、 マユール