尝试将XmlElementAttribute分配给.NET CF下的自定义IXmlSerializable对象时出现InvalidOperationException

时间:2012-08-28 17:47:08

标签: c# .net windows-mobile xml-serialization .net-cf-3.5

我们假设我们有一些类似的代码:

[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 - 同一个地方会发生同样的异常。

1 个答案:

答案 0 :(得分:1)

你可以试试。

public class ClassB<TKey, TValue>
    : NonSerializableClassC<TKey, TValue>, IXmlSerializable
where TKey : IXmlSerializable
where TValue : IXmlSerializable