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