Я пытаюсь сериализовать / десериализовать класс, имеющий поле типа 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
Как видите, сериализация работает, но при десериализации массив пуст.