Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > идентификация типов представленных в виде массива


Автор: boostcoder 7.5.2011, 17:30
всем доброго дня.

написал свою сериализацию.
встала следующая проблема. при сериализации, к примеру, size_t, размер которого 4 байта, и при попытке десериализовать его в, к примеру, uint64_t, получается очень трудно уловимая ошибка.
сериализация определяет, является ли тип POD-типом, и если да, то тип сохраняется в поток байтов путем взятия его адреса и sizeof(type). при десериализации так же, из потока байтов читается кол-во байт равное sizeof(type). так что, не сложно представить что произойдет, если записать в поток size_t и пытаться прочитать его как uint64_t.

так вот...
при сериализации нужно в поток писать так же и какой-то ID типа...
ничего лучшего не придумал.

подскажите варианты.

спасибо.

Автор: mes 7.5.2011, 18:38
а как boost serialization с этим справляется ?

Автор: boostcoder 7.5.2011, 18:47
mes, это очень сложно понять. мало того что просто разбираться в чужом коде не просто, так там еще и куча препроцессорного кода smile 
я по началу пытался некоторые моменты понять из нее, но потом забросил..

Добавлено через 2 минуты и 32 секунды
тут вариант надумался еще проще.. вместо того чтоб идентифицировать типы, нужно просто для POD`ов, предварительно записывать их размер.. это как вариант.
т.к. с не POD`ами подобной проблемы быть не может.

Автор: mes 7.5.2011, 18:56
Цитата(boostcoder @  7.5.2011,  17:47 Найти цитируемый пост)
вместо того чтоб идентифицировать типы, нужно просто для POD`ов, предварительно записывать их размер.

а в первом посте разве не то же самое написано ?:
Цитата(boostcoder @  7.5.2011,  16:30 Найти цитируемый пост)
то тип сохраняется в поток байтов путем взятия его адреса и sizeof(type). 


Добавлено через 1 минуту и 27 секунд
Цитата(boostcoder @  7.5.2011,  17:47 Найти цитируемый пост)
 так там еще и куча препроцессорного кода 

можно косвенно, изучив последовательность байт после сериализации нескольких простых типов..

Добавлено через 1 минуту и 49 секунд
Цитата(boostcoder @  7.5.2011,  17:47 Найти цитируемый пост)
т.к. с не POD`ами подобной проблемы быть не может. 

почему ?

Автор: boostcoder 7.5.2011, 19:02
Цитата(mes @  7.5.2011,  18:56 Найти цитируемый пост)
а в первом посте разве не то же самое написано ?

нет.
там описано как любой POD сохраняется. а я предлагаю перед записью самого POD`а, записывать его размер. а потом его.

но тут еще мысля появилась... для такого способа, кажется разумным будет для записи размера POD`а использовать однобайтовое значение. т.к. все натуральные POD`ы не могут быть больше 256. в таком случае, встает еще один вопрос: не натуральные POD`ы, т.е. структуры, ведь могут быть большими. так что, для записи размера пода использовать 32ух битное значение?

Добавлено @ 19:04
Цитата(mes @  7.5.2011,  18:56 Найти цитируемый пост)
почему ?

для собственных типов, юзер должен(может) сам описать способ сохранения/восстановления: http://liveworkspace.org/code/53266d05ae880b4d0d597a194f4e99b7
и если сериализация будет проверять размеры для POD типов, то у юзера никаких проблем не может возникнуть... по идее smile

Автор: mes 7.5.2011, 19:05
Цитата(boostcoder @  7.5.2011,  18:02 Найти цитируемый пост)
а я предлагаю перед записью самого POD`а, записывать его размер. а потом его.

нда, как всегда, невнимательно читая пост, подумал, что это у Вас уже есть, но не хватает...  smile

Добавлено через 1 минуту и 44 секунды
Цитата(boostcoder @  7.5.2011,  18:02 Найти цитируемый пост)
для собственных типов, 

Цитата(boostcoder @  7.5.2011,  18:02 Найти цитируемый пост)
проверять размеры для POD типов

понял о чем Вы, но Вы используете слово POD не в общепринятом смысле..  smile 


Автор: boostcoder 7.5.2011, 19:13
Цитата(mes @  7.5.2011,  19:05 Найти цитируемый пост)
Вы используете слово POD не в общепринятом смысле

?

Добавлено через 44 секунды
ааа.. Вы о том, что POD - это встроенный тип?

Автор: mes 7.5.2011, 19:17
Цитата(boostcoder @  7.5.2011,  18:13 Найти цитируемый пост)
ааа.. Вы о том, что POD - это встроенный тип? 

это как раз исходили из Вашего контекста, на самом деле это не так smile

Добавлено через 1 минуту и 21 секунду
т.е. POD это не только встроенные типы, и указатели,  а также некий ряд пользовательских типов..

Автор: boostcoder 7.5.2011, 19:20
в общем, я говорю о встроенных типах)

Автор: boostcoder 7.5.2011, 20:29
если я все правильно надумал, то тут нужно такое правило: сколько байт было записано - столько и нужно прочитать. вне зависимости от размера типа в который пытаемся сохранить.

Автор: mes 7.5.2011, 20:35
Цитата(boostcoder @  7.5.2011,  19:29 Найти цитируемый пост)
то тут нужно такое правило: сколько байт было записано - столько и нужно прочитать. вне зависимости от размера типа в который пытаемся сохранить.

имхо, если размер для сохранения меньше, то желательно сообщать об этом пользователю.. 

Автор: boostcoder 7.5.2011, 20:36
можно assert() выбросить.

Добавлено через 1 минуту и 49 секунд
это все же серьезная ошибка.

Автор: boostcoder 7.5.2011, 23:21
в бусте, так же, оказывается нет никакой проверки для бинарных архивов: http://liveworkspace.org/code/8a71f43a88c1cf59b0b295cca233924c

Автор: volatile 7.5.2011, 23:40
Цитата(mes @  7.5.2011,  20:35 Найти цитируемый пост)
имхо, если размер для сохранения меньше, то желательно сообщать об этом пользователю

Если размер больше, то тоже возможны нехорошие вещи.
напрмер мы сохранили 16 битную переменную short a = -1;
При считывании в 32-разрядную, получим
int a = 0xffff; т.е. 65535 вместо -1

нужно сохранять тогда и знак еще, не толкьо размер.

А вообще лучше сериализовать в текстовый вид. Это поможет избежить таких проблем. К томуже упростятся сразу проблемы с биг/литл эндиэн. 
Ну и если, при десериализации не помещается в переменную, выкидывать исключение.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)