2014-10-06 4 views
0

Я работаю над проектом, который требует десериализации файла фиксированной длины в структуру объекта.Шаблон для разных структур данных

Файл имеет эту базовую структуру:

- данные заголовка файла
----- группы
---------- детали

Обычно это будет тем не менее, этот конкретный формат файла содержит около 10 различных подформатов для подробных записей. Например, если строка подробностей начинается с кода «7», то ее формат ABC, с очень разными полями, чем формат XYZ (строки начинаются с 8).

Итак, мой вопрос в том, какой шаблон проектирования я мог бы использовать для реализации этого в элегантной форме?

Моя первая мысль - создать общий класс детали с свойством перечисления DetailType, а также иметь свойство типа IDetailSpec, называемое SpecData. IDetailSpec действительно будет просто интерфейсом маркера. Затем всякий раз, когда я работал с объектом Detail, я бы проверял свойство DetailType и выполнял приведение свойства SpecData в зависимости от контекста.

Это, однако, чувствует себя "неправильно" :)

Любые идеи приветствуются!

+0

Как вы храните данные, будет зависеть от того, что вам действительно нужно делать с этим. Не зная, что вам нужно делать с данными, разумное решение о том, как его хранить, не может быть сделано. – Servy

+0

Возможно, вам нужен шаблон фабрики, где параметр на заводе - это тип формата, а созданный тип знает, как десериализовать конкретный тип подробных записей. – antlersoft

+0

@Servy. Все сохраненные данные будут использоваться в приложении в зависимости от контекста операция под рукой. Например, существует концепция возврата подробной записи, поэтому у нас будет метод MarkForReturn(), который затем изменит поля записи подробных данных. Поля, которые меняются и какие значения изменяют их для всех, зависят от формата подробной записи. Другими словами, операции являются общими, но способы их реализации варьируются в зависимости от формата. –

ответ

1

Я бы предложил создать базовый класс, который обрабатывает поля, которые остаются одинаковыми между всеми различными типами деталей. (Данные, которые будут изменены, будут «десериализоваться» в одно поле на данный момент.) Затем вы должны иметь другой дочерний класс для каждого типа подробной записи и использовать шаблон заводского типа для создания экземпляров соответствующих дочерних классов на основе подробностей код строки. Каждый дочерний класс десериализуется из поля «подробные данные» объекта базового класса.

+0

Мне очень нравится эта идея. Спасибо! –