1

xml シリアライゼーションに関する奇妙な要件があります。

次の C# コードを参照してください (変数 'rootName' が範囲外であるため、コンパイルできません)。私の意図は、クラス GeneralData を「一般」にすることです。つまり、このクラスは、クラス コンストラクターの入力パラメーターに従って、異なるルート要素を持つ異なる XML 文字列にシリアル化できます。

[XmlRoot(ElementName = rootName)]
public class GeneralData : Dictionary<String, Object>, IXmlSerializable
{
    public string rootName;
    public GeneralData(string rootName)
    {
        this.rootName = rootName;
    }

    public System.Xml.Schema.XmlSchema GetSchema()
    {
        throw new NotImplementedException();
    }

    public void ReadXml(System.Xml.XmlReader reader)
    {
        throw new NotImplementedException();
    }

    public void WriteXml(System.Xml.XmlWriter writer)
    {
        foreach (var key in Keys)
        {
            var value = base[key];
            writer.WriteElementString(key, value.ToString());
        }
    }
}

誰でも私がタスクを達成するのを手伝ってくれますか? たぶん、まったく違う方法で?前もって感謝します!!

4

1 に答える 1

4

IXmlSerializableルート要素を制御することはできません。いいえ、それはできません。最も近い方法はnew XmlSerializer(...)、実行時に(コンストラクターに)ルート名を指定できるオーバーロードで使用することですが、注意が必要です。の重要なコンストラクターはXmlSerializer、組み込みのシリアライザーキャッシュを使用しません。つまり、次のようになります。ごとに新しいアセンブリを作成することnew XmlSerializer(...)になり、アセンブリがアンロードされることはありません。シリアライザーインスタンス用に独自のキャッシュレイヤーを追加しない場合、これによりメモリリークの問題が発生する可能性があります。

于 2012-10-08T10:39:33.903 に答える