Свойство XmlSerializer и Collection с частным установщиком - PullRequest
14 голосов
/ 21 мая 2009

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

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


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

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

Однако внизу страницы в сообществе добавлено следующее:

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

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

1 Ответ

14 голосов
/ 21 мая 2009

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

public class MyClass
{
    private List<int> _myCollection;

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

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