次のようなコードがあるとします。
[XmlRoot("class-a")]
public class ClassA
{
[XmlElement("variable")] // without this everything works fine
public ClassB<Type1, Type2> Variable;
public ClassA()
{
new XmlSerializer(typeof(ClassA)); // exception occurs here
}
}
public class ClassB<TKey, TValue>
: NonSerializableClassC<TKey, TValue>, IXmlSerializable
{
// irrelevant stuff
}
タイトルのコンテキストでは、すべてが一目瞭然です。
これは .NET CF [3.5] であり、XmlSerialization の内部が (パフォーマンスの問題により) 完全に異なることに注意してください。同じコードは、デスクトップ バージョンの .NET [4.0] で問題なく動作します。さらに、変数自体の名前を変更することで簡単に到達できる要素エイリアスにのみ XmlElementAttribute を使用するため、問題は実際には私の作業に影響を与えていません。しかし、それは本当の解決策ではありません。
だから...これがうまくいかない理由はありますか?
スタック トレースの最後のエントリ:
// . . .
System.Xml.dll!System.Xml.Serialization.XmlSerializer.XmlSerializer(System.Type type = {Name = "ClassA" FullName = "RandomProject.ClassA"})
System.Xml.dll!System.Xml.Serialization.XmlSerializer.XmlSerializer(System.Type type = {Name = "ClassA" FullName = "RandomProject.ClassA"}, System.Xml.Serialization.XmlAttributeOverrides overrides = null, System.Type[] extraTypes = null, System.Xml.Serialization.XmlRootAttribute root = null, string defaultNamespace = null)
System.Xml.dll!System.Xml.Serialization.XmlSerializer.findTypeByType(System.Type type = {Name = "ClassA" FullName = "RandomProject.ClassA"}, string defaultNamespace = null)
System.Xml.dll!System.Xml.Serialization.XmlSerializationReflector.FindType(System.Type type = {Name = "ClassA" FullName = "RandomProject.ClassA"}, bool encoded = false, string defaultNamespace = null, bool searchIntrinsics = true)
System.Xml.dll!System.Xml.Serialization.XmlSerializationReflector.AddType(System.Type type = {Name = "ClassA" FullName = "RandomProject.ClassA"}, bool encoded = false, string defaultNS = null, bool genericNullableArg = false)
UPD1 : ちなみに、ClassB 宣言の上に XmlTypeAttribute/XmlRootAttribute を追加すると、同じ場所で同じ例外が発生します。