Свойство 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;
}
}
}