Сбой десериализации массива XML как свойства List - PullRequest
0 голосов
/ 07 января 2019

Я пытаюсь сериализовать / десериализовать класс, имеющий поле типа ConcurrentBag.

Это был мой подход:

public class XmlSerializable
{
    [XmlIgnore]
    public ConcurrentBag<string> Array = new ConcurrentBag<string>();
    [XmlElement(ElementName = "Array")]
    public List<string> ArrayXml { get { return Array.ToList(); } set { Array = new ConcurrentBag<string>(value); } }
}

Когда я пытаюсь сериализовать его, все выглядит хорошо, но когда я пытаюсь десериализовать его обратно, массив становится пустым.

    XmlSerializable serializable = new XmlSerializable();
    serializable.Array.Add("entry1");

    XmlSerializer xmlSerializer = new XmlSerializer(typeof(XmlSerializable));
    StringWriter stringWriter = new StringWriter();
    XmlWriter xmlWriter = XmlWriter.Create(stringWriter, new XmlWriterSettings { Indent = true });
    xmlSerializer.Serialize(xmlWriter, serializable);
    string xml = stringWriter.ToString();
    Console.WriteLine(xml);

    StringReader stringReader = new StringReader(xml);
    XmlReader xmlReader = XmlReader.Create(stringReader);
    xmlSerializer = new XmlSerializer(typeof(XmlSerializable));

    XmlSerializable deserialized = (XmlSerializable)xmlSerializer.Deserialize(xmlReader);
    Console.WriteLine(deserialized.Array.Count);

Вот вывод фрагмента:

<?xml version="1.0" encoding="utf-16"?>
<XmlSerializable xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Array>entry1</Array>
</XmlSerializable>
0

Как видите, сериализация работает, но при десериализации массив пуст.

1 Ответ

0 голосов
/ 07 января 2019

Работает, когда класс определен так:

public class XmlSerializable
{
    [XmlIgnore]
    public ConcurrentBag<string> Array = new ConcurrentBag<string>();
    [XmlElement(ElementName = "Array")]
    public string[] ArrayXml { get { return Array.ToArray(); } set { Array = new ConcurrentBag<string>(value); } }
}

Свойство должно быть string[] вместо List<string>. Странно, хотя, так как он работает с полями типа List<T>, но, очевидно, не со свойствами типа List<T>.

...