Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> идентификация типов представленных в виде массива, байтов 
:(
    Опции темы
boostcoder
Дата 7.5.2011, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



всем доброго дня.

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

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

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

спасибо.

PM WWW   Вверх
mes
Дата 7.5.2011, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



а как boost serialization с этим справляется ?


--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 7.5.2011, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



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

Добавлено через 2 минуты и 32 секунды
тут вариант надумался еще проще.. вместо того чтоб идентифицировать типы, нужно просто для POD`ов, предварительно записывать их размер.. это как вариант.
т.к. с не POD`ами подобной проблемы быть не может.
PM WWW   Вверх
mes
Дата 7.5.2011, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(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`ами подобной проблемы быть не может. 

почему ?


--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 7.5.2011, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(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/53266d05ae88...d597a194f4e99b7
и если сериализация будет проверять размеры для POD типов, то у юзера никаких проблем не может возникнуть... по идее smile


Это сообщение отредактировал(а) boostcoder - 14.5.2011, 17:08
PM WWW   Вверх
mes
Дата 7.5.2011, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(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 



Это сообщение отредактировал(а) mes - 7.5.2011, 19:06


--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 7.5.2011, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



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

?

Добавлено через 44 секунды
ааа.. Вы о том, что POD - это встроенный тип?
PM WWW   Вверх
mes
Дата 7.5.2011, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



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

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

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



--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 7.5.2011, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



в общем, я говорю о встроенных типах)
PM WWW   Вверх
boostcoder
Дата 7.5.2011, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



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

PM WWW   Вверх
mes
Дата 7.5.2011, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



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

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



--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 7.5.2011, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



можно assert() выбросить.

Добавлено через 1 минуту и 49 секунд
это все же серьезная ошибка.
PM WWW   Вверх
boostcoder
Дата 7.5.2011, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



в бусте, так же, оказывается нет никакой проверки для бинарных архивов: http://liveworkspace.org/code/8a71f43a88c1...0b295cca233924c

PM WWW   Вверх
volatile
Дата 7.5.2011, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



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

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

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

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

Это сообщение отредактировал(а) volatile - 7.5.2011, 23:47
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0569 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.