XmlSerializer,xsi:serialize-deserialize-serialize后复制的类型(使用XmlAnyAttribute)

时间:2011-10-21 09:28:56

标签: .net xml-serialization xmlserializer

顺序序列化 - 反序列化 - 序列化TestClass时遇到问题:

[Serializable]
public class TestClass
{
    public TestClass() { }
    public Foo Foo { get; set; }
}

[XmlInclude(typeof(Bar))]
[Serializable]
public abstract class Foo
{
    [XmlAnyAttribute]
    public List<XmlAttribute> AnyAttr;
}

[Serializable]
public class Bar : Foo
{
}

void Test()
{
  var test = new TestClass { Foo = new Bar() };
  Console.WriteLine(test.Foo.AnyAttr == null);//true

  var firstXml = Helper.SerializeToXml(test);
  Console.WriteLine(Regex.Matches(firstXml, "xsi:type=").Count);//1

  var deserialiezedObject = Helper.DeserializeFromXml<TestClass>(firstXml);
  Console.WriteLine(deserialiezedObject.Foo.AnyAttr.Count);//1
  Console.WriteLine(deserialiezedObject.Foo.AnyAttr[0].Name);//xsi:type

  var secondXml = Helper.SerializeToXml(deserialiezedObject);
  Console.WriteLine(Regex.Matches(secondXml, "xsi:type=").Count);//2

 //var secondDeserialiezedObject = Helper.DeserializeFromXml<TestClass>(secondXml); //InvalidOperationException
    }

full sample

正如您所看到的,反序列化填充AnyAttr数组(通过一个元素 - “xsi:type”)。

奇怪的事情发生在我们序列化deserialiezedObject之后。它在Foo标签中生成两次“xsi:type”。

这是一个XmlSerializer错误还是我应该管理(例如,在反序列化后从AnyAttr中删除“xsi:type”)AnyAttr我自己的某种方式?

我有一堆自动生成的类,其中包含AnyAttr字段。

你能否建议如何在没有“xsi:type”复制的情况下序列化这样的对象?

2 个答案:

答案 0 :(得分:0)

尝试向Seralizer明确指定名称空间。我遇到了同样的问题。虽然我不确定原因是什么明确指定名称空间似乎解决它。

答案 1 :(得分:0)

没有找到比在每次反序列化后从AnyAttr(通过反射)删除“xsi:type”更好的解决方案