У нас есть довольно большой объектный граф, который нужно сериализовать и десериализовать множеством различных способов (режимов). В некоторых режимах мы хотим, чтобы определенные свойства были десериализованы, а в некоторых - нет. В будущих режимах также возможно, что для свойств будет больше параметров, чем да или нет. Проблема в том, как мы реализуем эти режимы.
Подход A (используйте конструктор десериализации и ISerializable.GetObjectData):
Если мы позволим каждому объекту графа сериализовать себя, используя конструктор десериализации, мы получим много переключателей для всех различных режимов десериализации. Преимущество этого подхода заключается в том, что вся логика десериализации находится в одном месте, и если мы добавим новые свойства, нам просто нужно изменить ISerializable.GetObjectData и конструктор десериализации. Другое преимущество состоит в том, что объект может принимать во внимание внутренние состояния, которые могут быть представлены публично. Самый важный недостаток заключается в том, что нам самому объекту данных необходимо знать обо всех возможных режимах сериализации. Если нам нужен новый режим, нам нужно изменить объекты данных.
Подход B (Фабричные классы / методы десериализации):
Другой подход заключается в том, чтобы иметь какие-то фабричные классы / методы десериализации, по одному для каждого режима, который выполняет сериализацию и десериализацию извне (например, GraphSerializer.SerializeObjectTypeX (ObjectTypeX objectToSerialze). Преимущество заключается в том, что всякий раз, когда мы хотим новый режим, мы просто добавьте новый фабричный класс / метод, и наш Dataobject не будет загроможден всеми введенными режимами сериализации. Основным недостатком здесь является то, что мне придется многократно писать один и тот же код сериализации для всех различных режимов. Если два режима отличаются только одним или двумя свойствами, но мне придется снова реализовать полную логику для всего графа. Когда я добавляю новое свойство к объекту данных, мне нужно обновить все фабричные классы.
Так что мне интересно, есть ли лучший подход к этой общей проблеме ИМХО. Или даже лучшая практика в .NET? Или, может быть, я просто подхожу ко всему с неправильной точки зрения?