Я разрабатываю структуру обучения/обучения C#. Я планирую добавить поддержку сериализации/десериализации объектов с помощью этих спецификов:
- Логика очень индивидуальна (не json/xml и т. Д.).
- Пользователи фреймворта должны быть способны добавлять свои собственные сериализаторы/Deserializers только для типа. или только десериализация.
Я рассматриваю подходы к хранению:
- Dictionary: ключ - тип целевого объекта, значение - Serializer/Deserializer type . Экземпляры создаются по требованию с помощью отражения (Activator.CreateInstance< /code>).
pro: < /strong> с более низким следствием памяти.
con: < /strong> отражение на накладные расходы на все использование = Hit. < /li>
Dictionary: ключ - тип целевого объекта, значение - экземпляр из сериализатора/deserializer.
pro: Высокая производительность (не отражение на вызов).
con: более высокое использование памяти (все случаи живут постоянно). Словарь . При первом доступе создайте экземпляр Serializer/Deserializer через отражение и Cache IT (например, в словаре ). Используйте кэшированный экземпляр после этого.
Цель: Mamer/Performance.
- опция a: интерфейсы
public interface ISerializer { string Serialize(T obj, ...); }
public interface IDeserializer { T Deserialize(string obj, ...); }
< /code>
pros: < /strong> < /p>
Один класс может реализовать оба интерфейса (MyConverter : ISerializer, IDeserializer). - более гибкий.
минусы:
- не принуждает к соблюдению типа ссылки (может быть структурой ) -> риск коробочки, когда в Dictionary < /ul>
< /li>
Вариант B: Аннотация классов < /strong> < /p>
public abstract class Serializer { public abstract string Serialize(T obj, ...); }
public abstract class Deserializer { public abstract T Deserialize(string obj, ...); }
pros:
Обеспечивает соблюдение класса (тип ссылки) -> Без бокса при хранении.
stronger
Подробнее здесь: https://stackoverflow.com/questions/796 ... ork-storag