Сериализация
От: PavelCH  
Дата: 05.09.09 06:51
Оценка:
Добрый день всем!

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

— Заголовок. Количество элементов типа А, типа B, типа C, ... типа N.
— A[0], A[1], A[2], ... A[n]
— B[0], B[1], B[2], ... B[n]
— C[0], C[1], C[2], ... C[n]
...
— N[0], N[1], N[2], ... N[n]

Само описание этих структур (A,B,C ... N) также известно. Моя программа должна работать с этими данными. Вопрос как красиво читать эти данные и записывать назад. Вот мои мысли:

1. Написать свои классы, которые по полям полностью соответствуют структурам из документации. Не делать виртуальных методов, так как под этот механизм в каждом элементе выделяется память размером с указатель. Установить опцию компилятора "выравнивать элементы структур до байта". При инициализации программы разом читать массивы данных целиком наподобии fread(SizeOfElement,CountOfElements). Минус — отсутствие виртуальных методов. Плюс — знаю как реализовать.

2. Написать свои классы, которые по полям полностью соответствуют структурам из документации, однако использовать виртуальные методы (очень хотелось бы использовать). Установить опцию компилятора "выравнивать элементы структур до байта". При инициализации программы разом читать каждый элемент массива отдельно, но каким-то образом загружать его начиная не с первого байта, а с четвертого в мой класс. Минус — не знаю как сделать лучше (знаю как сделать преобразованием указателей к байту — но это не красиво).

3. Написать свои классы произвольно структуры. Каждое отдельное поле элемента загружать отдельно. Возможно делать какое-то подобие "метаданных". Минусы — сложность реализации, а также документировать каждую структуру где-то отдельно в метаданных.

Что вы думаете, как лучше поступить?
Нехай щастить
Re: Сериализация
От: Sashaka Россия  
Дата: 05.09.09 07:19
Оценка:
Здравствуйте, PavelCH, Вы писали:

PCH>Добрый день всем!

PCH>Что вы думаете, как лучше поступить?

Лучше поступить проще (вариант 1). Только опцию компилятора выставлять локально (если MSVC через прагму). Непонятна фраза "использовать виртуальные методы (очень хотелось бы использовать)".
Re: Сериализация
От: Sergey Россия  
Дата: 05.09.09 07:41
Оценка:
Здравствуйте, PavelCH, Вы писали:

PCH>Есть файл в котором находится заголовок, а также десятка два различных структур данных оформленных в виде непрерывных массивов с известным количеством элементов, размер которых также известен. То есть что то вроде:


PCH>- Заголовок. Количество элементов типа А, типа B, типа C, ... типа N.

PCH>- A[0], A[1], A[2], ... A[n]
PCH>- B[0], B[1], B[2], ... B[n]
PCH>- C[0], C[1], C[2], ... C[n]
PCH>...
PCH>- N[0], N[1], N[2], ... N[n]

PCH>Само описание этих структур (A,B,C ... N) также известно. Моя программа должна работать с этими данными. Вопрос как красиво читать эти данные и записывать назад. Вот мои мысли:


PCH>1. Написать свои классы, которые по полям полностью соответствуют структурам из документации. Не делать виртуальных методов, так как под этот механизм в каждом элементе выделяется память размером с указатель. Установить опцию компилятора "выравнивать элементы структур до байта". При инициализации программы разом читать массивы данных целиком наподобии fread(SizeOfElement,CountOfElements). Минус — отсутствие виртуальных методов. Плюс — знаю как реализовать.


PCH>2. Написать свои классы, которые по полям полностью соответствуют структурам из документации, однако использовать виртуальные методы (очень хотелось бы использовать). Установить опцию компилятора "выравнивать элементы структур до байта". При инициализации программы разом читать каждый элемент массива отдельно, но каким-то образом загружать его начиная не с первого байта, а с четвертого в мой класс. Минус — не знаю как сделать лучше (знаю как сделать преобразованием указателей к байту — но это не красиво).


PCH>3. Написать свои классы произвольно структуры. Каждое отдельное поле элемента загружать отдельно. Возможно делать какое-то подобие "метаданных". Минусы — сложность реализации, а также документировать каждую структуру где-то отдельно в метаданных.


PCH>Что вы думаете, как лучше поступить?


Если планируется, что программа будет жить долго и/или собираться на разных компиляторах, то лучше 3.
Если нет, то сойдет и 1. С виртуальными методами все просто — наследуешься от сериализуемых структур и дописываешь виртуальные методы.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[2]: Сериализация
От: PavelCH  
Дата: 05.09.09 08:43
Оценка:
Здравствуйте, Sashaka, Вы писали:

S>Лучше поступить проще (вариант 1). Только опцию компилятора выставлять локально (если MSVC через прагму). Непонятна фраза "использовать виртуальные методы (очень хотелось бы использовать)".


Имеется ввиду добавить в эти структуры абстрактные методы и наследовать их.
Нехай щастить
Re[2]: Сериализация
От: PavelCH  
Дата: 05.09.09 08:46
Оценка:
Здравствуйте, Sergey, Вы писали:

S>Если нет, то сойдет и 1. С виртуальными методами все просто — наследуешься от сериализуемых структур и дописываешь виртуальные методы.


О. Спасибо. Похоже это оно.
Нехай щастить
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.