0

タイプが列のカスタム 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 をシリアライズしたいのですが、その方法を提案してください。

よろしくお願いします、 マユール

4

0 に答える 0