InvalidOperationException при попытке назначить XmlElementAttribute для пользовательского объекта IXmlSerializable в.NET CF

Давайте предположим, что у нас есть некоторый код, похожий на этот:

[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: Кстати, если я добавлю XmlTypeAttribute/XmlRootAttribute выше объявления ClassB - то же самое исключение происходит, в том же месте.

1 ответ

Решение

Вы могли бы попробовать.

public class ClassB<TKey, TValue>
    : NonSerializableClassC<TKey, TValue>, IXmlSerializable
where TKey : IXmlSerializable
where TValue : IXmlSerializable
Другие вопросы по тегам