Загрузка / сохранение списка интерфейсов - PullRequest
0 голосов
/ 30 сентября 2019

В моем приложении я использую список объектов, реализующих мой ISorter интерфейс с выставками одного метода void Sort (MyClass myClass)

Пока я создал этосписок в точке входа в мое приложение с жестко заданным набором реализаций ISorter . Теперь я нахожусь в точке, где я хотел бы иметь возможность сохранить и загрузить этот список из файла.

Я бы хотел, чтобы формат был XML, чтобы его можно было редактировать вручную, но я обнаружил это. NET XMLSerializer класс не может сериализовать интерфейсы. Он может сериализовать список базовых классов, при условии, что я помечаю базовый класс соответствующими атрибутами:

[System.Xml.Serialization.XmlInclude(typeof(MyClassA))]
[System.Xml.Serialization.XmlInclude(typeof(MyClassB))]
class MyBaseClass

Мне это не нравится, так как он загромождает мой класс специфическими для xml атрибутами, когда я могу захотеть заменить сериализацию xmlпозже с другим методом хранения.

  1. В чем недостаток замены интерфейса ISort базовым классом SortBase для упрощения сериализации? Является ли использование интерфейса здесь неправильно с самого начала? Должен ли я сохранить интерфейс, но реализовать его, используя SortBase класс, из которого происходят все мои другие классы?

  2. Как я могу абстрагировать хранилище так, чтобы реализация хранилищаможет быть изменено позже, и избежать украшения моих классов с атрибутами xml?

  3. Любая дополнительная информация о передовых практиках, касающихся хранения / загрузки данных, будет полезна

РЕДАКТИРОВАТЬ: Идея заключается в том, что пользователь может создать текстовый файл (предпочтительнее atm XML), определяющий операции сортировки, которые можно загружать и применять к набору данных.

РЕДАКТИРОВАТЬ2: Я упростил этоситуация

class Foo{
   List<ISorter> MySorters
}

interface ISorter{
   void Sort(MyClass myClass)
}

class SortByColor : ISorter{
   public string SomeColorProperty{get;set;}
   void Sort(MyClass myClass)
}

class SortByName: ISorter{
   public string SomeNameProperty{get;set;}
   void Sort(MyClass myClass)
}

Я хотел бы передать мой Список некоторому методу хранения / загрузки, который может создать / загрузить список из некоторого источника данных, лежащего в основе (например, файла XML)

EDIT3: Возможно, в конечном итоге я буду использовать DataContractserializer или XMLSerializer , поскольку это решит мою проблему, если я предоставлю общие базовые классыs. Я ожидал, что будет более элегантный способ, которым это можно будет обработать, не загрязняя мои объекты атрибутами

...