4

注: XMLIgnoreは答えではありません。

OK、それでXML Serialization and Inherited Typesに関する私の質問に続いて、私はそのコードを私が取り組んでいるアプリケーションに統合し始めました.

IEnumerableICollection<T>を実装するいくつかのクラスで問題が発生しました

これらの問題は、XMLSerializer がこれらをシリアライズしようとすると、それらを外部プロパティと見なし、使用したいプロパティ (つまり、AbstractXmlSerializerのプロパティ) を使用する代わりに、ここに来てフォールオーバーすることです (原因:型の不一致)、ほぼ振り出しに戻ります。これらのメソッドをXmlIgnore属性で装飾することもできないため、その方法で停止することはできません。

私の現在の解決策は、インターフェイスの実装を削除することです (この現在のアプリケーションでは、それは大したことではなく、コードをきれいにしただけです)。

これに対する私のプライドを飲み込み、それができないことを受け入れる必要がありますか? 私はちょっとプッシュして、XmlSerializer から予想以上のものを得たことを知っています:)


編集

また、追加する必要があります。現在、フレームワーク 2 で作業しています。


アップデート

lomaxx の回答を受け入れました。私のシナリオでは、実際にこれを行うことはできませんが、うまくいくことはわかっています。他に提案がなかったため、コードからインターフェイスの実装を削除することになりました。

4

3 に答える 3

4

この問題は、System.RunTime.Serialization dll (.net 3.x アセンブリ) を入手して、.net 2.0 アプリケーションから参照することで回避できます。これが機能するのは、.net 3.0 バイナリが .net 2.0 CLR で実行するようにコンパイルされているためです。

これを行うことで、ICollection をパラメータとして Web サービスに渡したいのですが、xmlserializer がそれを適切に処理する方法を知らなかったという同様の問題を回避するために使用した DataContractSerliazer にアクセスできます。

2.x アプリケーションで .net 3.x dll を使用することに慣れている場合は、DataContractSerializer を使用してこの問題を解決できるはずです。

于 2008-08-28T07:45:11.467 に答える
3

答えが遅すぎて特定のアプリケーションに役立たないと思いますが、同じ問題を抱えている人が他にいる可能性があります。

IEnumerable型にIXmlSerializableを実装して、この動作を回避できると思います。ただし、これは、このタイプのシリアル化プロセスを完全に制御する必要があることを意味します。XmlReader / XmlWriterをいじる必要がない簡単なアプローチでは、シリアル化するすべてのデータのpublicctorおよびpublicread-write-propertiesを使用してヘルパーxmlアダプタークラスを記述し、このタイプの一時的なXmlSerializerオブジェクトを内部に作成できます。 IXmlSerializable。[読み取り|書き込み]Xml()。

class Target : IEnumerable<Anything>, IXmlSerializable
{
//...

public void ReadXml(System.Xml.XmlReader reader)
{
    reader.ReadStartElement();
    TargetXmlAdapter toRead = (TargetXmlAdapter)new XmlSerializer(typeof(TargetXmlAdapter)).Deserialize(reader);
    reader.Read();

    // here: install state from TargetXmlAdapter
}

public void WriteXml(System.Xml.XmlWriter writer)
{
    // NOTE: TargetXmlAdapter(Target) is supposed to store this' state being subject to serialization
    new XmlSerializer(typeof(TargetXmlAdapter)).Serialize(writer, new TargetXmlAdapter(this));
}
}
于 2009-06-26T10:45:02.843 に答える
1

これらの属性を使用する場合:

        [XmlArray("ProviderPatientLists")]
        [XmlArrayItem("File")]
      public ProviderPatientList Files
    {
        get { return _ProviderPatientLists; }
        set
        {
            _ProviderPatientLists = value;
        }
    }

ProviderPatientList が継承する場所List<PatientList>

その後、作成される xml 出力をより詳細に制御できます。

于 2008-08-28T07:59:32.897 に答える