Десериализация из 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.
Есть ли способ сделать так, чтобы десериализовать объект, не возвращая ссылку на него?