Свойство XmlSerializer и Collection с приватным установщиком

Скажем, у меня такой простой класс

[Serializeable]
public class MyClass
{
    public MyClass()
    {
       this.MyCollection = new List<int>();
    }


    public List<int> MyCollection { get; private set;}
}

Если я попытаюсь десериализовать это с помощью XmlSerializer, я получаю сообщение об ошибке, указывающее, что MyCollection доступен только для чтения и не может быть назначен. Однако я не хочу, чтобы сеттер был общедоступным, так как это может вызвать всевозможные проблемы, если пользователь класса назначает ему. FxCop справедливо предупреждает об этом: Свойства коллекции должны быть прочитаны только

Однако в нижней части страницы добавленного контента сообщества:

XmlSerializer понимает только для чтения коллекции коллекции свойства не обязательно должны быть read-write для XmlSerializer для сериализовать и десериализовать содержимое правильно. XmlSerializer будет выглядеть для метода под названием Add on collection свойства, реализующие ICollection или IEnumerable, и использовать это для заполнять коллекцию, когда десериализация экземпляра владельца тип.

Однако это, похоже, не так (поскольку я получаю InvalidOperationException). Что я могу сделать, чтобы повиноваться наилучшей практике сохранения свойства setter private, все еще позволяя мне использовать XmlSerializer?

Ответы

Ответ 1

Ваш частный сеттер вызывает проблему. Класс XmlSerializer отлично работает с классом, который я привел ниже. Класс XmlSerializer был изобретен до того, как были введены частные сеттеры, поэтому, вероятно, это неверно проверяется при сканировании типа класса с использованием отражения. Возможно, вам следует сообщить об этом Microsoft как об ошибке.

public class MyClass
{
    private List<int> _myCollection;

    public MyClass()
    {
        _myCollection = new List<int>();
    }

    public List<int> MyCollection
    {
        get
        {
            return this._myCollection;
        }
    }
}