XmlSerializer, xsi: type дублируется после serialize-deserialize-serialize (используется XmlAnyAttribute) - PullRequest
0 голосов
/ 21 октября 2011

У меня проблема при последовательной сериализации-десериализации-сериализации 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
    }

полный образец

Как вы можете видеть, десериализация заполняет массив AnyAttr(одним элементом - "xsi: type").

Странная вещь происходит после того, как мы сериализовали десериализованный объект.Он выдает «xsi: type» дважды в теге Foo.

Это ошибка XmlSerializer, или я должен управлять (например, удалить "xsi: type" из AnyAttr после десериализации) AnyAttr самостоятельно каким-либо образом?

У меня есть несколько автоматически сгенерированныхклассы, которые содержат поле AnyAttr.

Не могли бы вы предложить, как сериализовать подобные объекты без дублирования "xsi: type"?

Ответы [ 2 ]

0 голосов
/ 20 ноября 2011

Не нашел лучшего решения, чем простое удаление "xsi: type" из AnyAttr (через отражение) после каждой десериализации

0 голосов
/ 21 октября 2011

Попробуйте явно указать ваши пространства имен для Seralizer. Я столкнулся с той же проблемой. Хотя я не был уверен в том, что причина была в том, чтобы явно указать пространства имен, это, похоже, исправило это.

...