Десериализация из XML в c#

У меня есть такой класс

[Serializable]
public class BankDepartment
{
    // Поля класса.
    private List<Order> _collection; // Коллекция объектов Order.

    // Индексатор.
    public Order this[int index]
    {
        get
        {
            if(index > _collection.Count - 1)
                throw new Exception("Индекс выходит за пределы коллекции.");

            return _collection[index];
        } // get.
        set
        {
            if (index > _collection.Count - 1)
                throw new Exception("Индекс выходит за пределы коллекции.");

            _collection[index] = value;
        } // set.
    } // indexer.

    // Для реализации репозитория мы не должны отдавать ссылку на нашу коллекцию,
    // но сериализация в XML вынуждает нас создать свойство для коллекции.
    // Поэтому отдаём копию.
    //public List<Order> Collection
    //{
    //    get => _collection.Clone().ToList();
    //    set => _collection = value;
    //} // Collection.

    public List<Order> Collection
    {
        get => _collection;
        set => _collection = value;
    }

    // Ансамбль конструкторов.
    // Конструктор по умолчанию.
    public BankDepartment():this(new List<Order>()) { }

    // Конструктор с параметрами. Внедрение зависимостей.
    public BankDepartment(List<Order> collection) =>
        _collection = collection;

    #region Реализация репозитория
    // Реализация репозитория.
    // Оболочка для добавления.
    public void Add(Order order) =>
        _collection.Add(order);

    // Оболочка для удаления.
    public bool Remove(Order order) =>
        _collection.Remove(order);

    // Оболочка для удаления по индексу.
    public void RemoveAt(int index) =>
        _collection.RemoveAt(index);
    #endregion

    public override string ToString()
    {
        // Создаём объект стрингбилдера.
        StringBuilder sbr = new StringBuilder();

        // Заполняем sbr.
        foreach (var item in _collection)
            sbr.Append(item);

        return sbr.ToString();
    } // ToString.
} // BankDepartment.

Если я пытаюсь десериализовать и свойство коллекции класса объявлено так, то бишь я возвращаю не ссылку на коллекцию, а её копию, то десериализация не проходит:

{
    get => (List<Order>)_collection.Clone();
    set => _collection = value;
} // Collection.

Если же свойство коллекции объявлено так, то всё прекрасно десериализуется:

public List<Order> Collection
{
    get => _collection;
    set => _collection = value;
}

Вот само определение метода Deserialize<>:

public static T Deserialize<T>()
    {
        XmlSerializer formatter = new XmlSerializer(typeof(T));

        using (FileStream fs = new FileStream("test.xml", FileMode.OpenOrCreate))
        {
            var item = (T)formatter.Deserialize(fs);

            return item;
        }
    } // Deserialize.

Есть ли способ сделать так, чтобы десериализовать объект, не возвращая ссылку на него?


Ответы (0 шт):