5

C#のかなり些細なクラス構造にXMLシリアル化を追加しようとしています。基本的に、ルートクラス(AClassと呼びます)の単一のインスタンスがあり、他のクラス(AnotherClassと呼びます)のいくつかのインスタンスのリストを保持します。

[XmlRoot("RootNode")]
public class AClass {
    [XmlElement("ListNode")]
    internal List otherObjects { get; set; }
}

public class AnotherClass {
    [XmlAttribute("Name")]
    internal string name { get; set; }
}

シリアル化するときは、これら両方のクラスを一緒にシリアル化する必要があります。つまり、AClassをシリアル化すると、AnotherClassのリストもシリアル化されます(この質問を参照)。

私はこれをほとんど機能させていますが、問題は、シリアル化中に、XmlSerializerがクラスのプロパティのみを処理したいように見えることですpublic-リストが宣言されている場合、AnotherClassはまったくシリアル化されませんinternal

アセンブリの内部をシリアライザーから見えるようにしてみました。

[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("System.Xml")]

それは何もしなかったようです。XmlSerializerに、内部で宣言されたオブジェクトのリストを再帰的にシリアル化する方法はありますか?

4

2 に答える 2

6

実際のシリアル化はSystem.Xmlではなく、動的に生成されたアセンブリによって実行されることを除いて、あなたは正しい方向に進んでいます。そのアセンブリの名前を予測することはできないため(ランダムに生成されます)、InternalsVisibleTo属性で使用することはできません。

唯一の解決策は、XMLシリアル化アセンブリを事前に生成することです。XML Serializer Generator Tool(Sgen.exe)を使用してこれを行うことができます。生成されたアセンブリの名前は「YourAssembly.XmlSerializers」になります。InternalsVisibleToこれは、属性で使用する必要のある名前です。

于 2010-02-14T22:12:48.957 に答える
1

属性を追加するというアイデアはInternalsVisibleTo良いものですが、問題は、Xmlシリアル化コードがアセンブリ内のパブリックタイプのみを検索することだと思います。
私の知る限り、XmlSerializerで内部型をシリアル化または逆シリアル化する方法はありません。型をパブリックとして宣言するか、独自のシリアル化コードを作成する必要があります。
さらに、XmlSerializerクラスのドキュメントには、オブジェクトのパブリックプロパティのみがシリアル化されることが明示的に記載されています。「XMLシリアル化は、オブジェクトのパブリックプロパティとフィールドをストレージまたはトランスポート用のシリアル形式(この場合はXML)に変換するプロセスです」。ですから、それは本当に設計上の決定のように見えます。

于 2010-02-14T22:11:36.010 に答える