【问题标题】:XmlSerializer, xsi:type duplicated after serialize-deserialize-serialize (XmlAnyAttribute used)XmlSerializer, xsi:type 在 serialize-deserialize-serialize 之后重复(使用了 XmlAnyAttribute)
【发布时间】:2011-10-21 09:28:56
【问题描述】:

顺序序列化-反序列化-序列化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”)。

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

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

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

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

【问题讨论】:

    标签: .net xml-serialization xmlserializer


    【解决方案1】:

    尝试将您的命名空间显式指定给 Seralizer。我遇到了同样的问题。虽然我不确定明确指定命名空间的原因似乎可以解决它。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2017-08-24
        • 2019-06-07
        • 1970-01-01
        • 2012-01-07
        • 1970-01-01
        • 1970-01-01
        • 2019-04-18
        • 1970-01-01
        • 2013-07-16
        相关资源
        最近更新 更多