11

C#でXmlSerializerを使用すると、驚くべき動作が発生しました。次のコードについて考えてみます。

public class A : IEnumerable
{
    public class B
    {
        [XmlAttribute]
        public string PropA { get; set; }
        [XmlElement]
        public string PropB { get; set; }
    }

    public IEnumerator GetEnumerator ()
    {
        yield break;
    }
}

class Program
{
    static void Main (string[] args)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(A.B));

        XmlTextWriter writer = new XmlTextWriter(@"E:\temp\test.xml", Encoding.Default);
        serializer.Serialize(writer, new A.B() { PropA = "one", PropB = "two" });
    }
}

この例では、ネストされたクラスABのインスタンスをシリアル化しようとしますが、それ自体はコンテナクラスAをまったく使用していません。しかし、そのためにXmlSerializerを構築しようとすると、次の例外がスローされます。

InvalidOperationExceptionは処理されませんでした:

XMLをシリアル化するには、IEnumerableから継承する型に、継承階層のすべてのレベルでAdd(System.Object)を実装する必要があります。Test.AはAdd(System.Object)を実装していません。

XmlSerializerは、実際にタイプABをシリアル化しようとしているときに、タイプAに対してシリアル化制約を適用しようとしています。ただし、外部タイプのインスタンスのデータへの特権アクセスを除いて、ネストされたタイプは特別ではなく、あたかもそうであるかのように動作します。名前空間で。

この理解は正しくありませんか?ネストされた型またはXmlSerializerのセマンティクスはこの動作を正当化しますか、それともXmlSerializerのバグのように感じますか?

特にXmlSerializerセマンティクスに関して、ネストされたタイプに対して適用されたときにすべての外部タイプにXmlSerializer制約を適用する文書化された要件はありますか?

4

4 に答える 4

1

http://msdn.microsoft.com/en-us/library/vstudio/ms229027%28v=vs.100%29.aspx

入れ子になった型は宣言する型のメンバーとして扱われるため、入れ子になった型は宣言する型の他のすべてのメンバーにアクセスできます。

そのため、シリアライザが AB を操作する場合は、A の定義も必要です。IEnumerable 検証が開始される場所。

B が実際には A の何も参照していなくても構いません :)

于 2013-06-13T20:38:27.490 に答える
0

XmlSerializer は、IEnumerable または ICollection を実装するクラスを特別に扱います。

詳細はこちら: XmlSerializer および IEnumerable: パラメーターなしのコンストラクターなしでシリアル化が可能: バグ?

于 2013-03-07T11:01:39.350 に答える
0

おそらく、これはシリアライゼーション ランタイムでは非常に難しい問題ですが、この動作については適切な説明がありません。IEnumerable の制限はクラス B には当てはまらないような気がします。

于 2013-07-25T15:08:59.243 に答える
0

ここで制約を課しているのは IEnumerable です。例外で提案されているように Add メソッドを追加すると、コードは正常に動作します。繰り返しますが、これは XmlSerialization とはほとんど関係がなく、IEnumerable の動作方法とは関係ありません。私がここから外れている場合は、私を修正してください。 同じことについての良い議論については、これをチェックしてください。

于 2012-05-04T10:11:10.223 に答える