XmlSerializer и свойства массива C# - жалуется Рослин - PullRequest
2 голосов
/ 15 января 2020

У меня было несколько классов со свойствами массива publi c, которые были сериализованы и десериализованы нормально. Анализатор кода жаловался на то, что у вас не должно быть массивов в качестве общедоступных c свойств. Поэтому я изменил (как это было предложено CA) мои свойства на методы, которые теперь устанавливают и получают мои поля приватного массива. Проблема: XmlSerializer, конечно, больше не сериализует их. Каков наилучший способ сериализации массивов без жалоб анализатора кода? Я также попытался изменить свои свойства в списки (второе предлагаемое решение от CA), но затем CA хочет, чтобы они были без установщика, что снова не приведет к сериализации!

1 Ответ

0 голосов
/ 15 января 2020

В конечном счете, вы можете отменить руководство CA, если этого требует ваш сценарий; это абсолютно нормально. Однако! Список только для получения должен быть в порядке; типичным сценарием будет:

public List<Bar> Bars { get; } = new List<Bar>();

(необязательно с некоторыми атрибутами [XmlElement], [XmlArray] или [XmlArrayItem] et c).

Если это не делает ' т работа; пожалуйста, опубликуйте минимальный пример, который показывает, что он не работает.

Вот пример того, как он работает:

class Program
{
    static void Main()
    {
        var foo = new Foo {
            Bars = {
                    new Bar { X = 42 },
                    new Bar { X = 12 },
                    new Bar { X = 6 },
                }
        };

        var ser = new XmlSerializer(foo.GetType());
        var sw = new StringWriter();
        ser.Serialize(sw, foo);
        var xml = sw.ToString();
        Console.WriteLine(xml);
        var sr = new StringReader(xml);
        var clone = (Foo)ser.Deserialize(sr);
        foreach (var bar in clone.Bars)
            Console.WriteLine(bar.X);
    }
}

public class Foo
{
    public List<Bar> Bars { get; } = new List<Bar>();
}
public class Bar
{
    public int X { get; set; }
}
...