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制約を適用する文書化された要件はありますか?