![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Superklug |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 227 Регистрация: 16.6.2006 Репутация: нет Всего: нет |
Доброго времени суток!
Существуют ли в C++ средства для работы с памятью как с потоком? Есть класс, для которого есть возможность сериализации. В поток записываются бинарные данные. Если нужно записать объект в память, то в качестве потока использую std::stringstream, затем преобразование вида:
А вот с десериализацией возникла проблема( Есть void*, а как с ним работать как с потоком - не знаю. Если бы был известен размер, можно было бы просто скопировать в stringstream, но размера я не знаю. Пока две мысли: написать копии функций для сериализации/десериализации только не для потоков, а для void*. Либо создать свой класс потока (унаследоать от стандартного потока stl). Ни тот, ни другой вариант не нравится( Надеюсь на вашу помощь.. Заранее спасибо! |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
измени сериализацию и пиши размер в первые 2/4 байта бинарных данных.
|
|||
|
||||
Superklug |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 227 Регистрация: 16.6.2006 Репутация: нет Всего: нет |
azesmcar, возможности писать размер - нет. Формат бинарных данных определен строго...
А что значит измени сериализацию? |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
значит измени код, который сериализирует твой объект, и добавь в сериализацию размер.
довольно странный формат данных, в котором не указывается размер, каким образом предполагается обратное приведение? |
|||
|
||||
Superklug |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 227 Регистрация: 16.6.2006 Репутация: нет Всего: нет |
Разумеется там указывается размер. Просто это не размер всего блока данных. Например массив из двух строк: первый размер - 2, а затем еще для каждой строки. ( 2 6"привет" 5"hello"). Ну это очень грубо говоря) Вобщем оценить размер всего блока данных достаточно сложно... Хотелось бы читать данные из памяти как из потока... |
|||
|
||||
Superklug |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 227 Регистрация: 16.6.2006 Репутация: нет Всего: нет |
Я бы рад) Да вот только не знаю как... Как перевести из void* в stringstream не зная размера? Добавлено через 1 минуту и 40 секунд Earnest, прошу прощения.. Не правильно прочитал. Сейчас разберусь с strstream.. На первый взгляд - то, что нужно! Спасибо! |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Да, не заметила, что ты не знаешь размер буфера...
Нехорошо, присоединяюсь к предыдущему оратору: измени код так, чтобы знать. Ведь откуда-то ты этот буфер берешь, не с неба же. -------------------- ... |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
читай как хочешь, но в конечном итоге это чтение из бинарного блока данных, и если о его размере ничего не известно то никакой адаптер в виде потоков не поможет. кстати это не меняет формата данных, будешь считать, что твои данные начинаются по смещению 2 байта, а первые 2 будешь использовать для хранения размера. Это сообщение отредактировал(а) azesmcar - 18.6.2010, 11:26 |
|||
|
||||
Superklug |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 227 Регистрация: 16.6.2006 Репутация: нет Всего: нет |
=) Сейчас поясню подробней... Есть класс который представляет собой что-то похожее на Variant. Его упаковывают в особый бинарный формат. Разумеется когда упаковали размер известен. Эти упакованные данные передаются в функции DLL как const void*. Можно конечно в эти же функции передавать и размер (отдельным параметром), но хочется обойтись без этого. Формат же содержит размер, хоть и не явно. Если бы была возможность работать с памятью, как с потоком, то никаких проблем не было бы. Т.е. последовательно читать байты из памяти и все... Можно (наверное) написать наследника от istream и определить нужные операции. Но это решение кажется каким-то громоздким. Вот и подумал, что существует способ получше. |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
повторяюсь, это сводится к чтению того же бинарного блока данных, то, что ты хочешь - обыкновенный адаптер, в конечном итоге этот код чтения должен быть где-то написан, а как его писать, если ты размера не знаешь. |
|||
|
||||
Superklug |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 227 Регистрация: 16.6.2006 Репутация: нет Всего: нет |
Не понимаю =(
Рассмотрю пример, приведенный выше... Есть void*. Считываю первые 4 байта (int) - получаю количество элементов массива (2шт). Затем считываю еще 4 байта - получаю число символов в строке. Затем считываю соответствующее число байт для строки. После этого так же считываю вторую строку. Все корректно считается не смотря на то, что суммарного размера (23 байта) я не знал. |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Superklug
и сколько так? как узнать, что пора остановиться? Ты же сам писал, что тебе нужен размер всего блока и это бы решило проблему. ну так добавь размер, в чем проблема? |
|||
|
||||
Superklug |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 227 Регистрация: 16.6.2006 Репутация: нет Всего: нет |
||||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
||||
|
||||
Superklug |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 227 Регистрация: 16.6.2006 Репутация: нет Всего: нет |
Еще раз повторяюсь. Размер косвенно известен. Т.е. вовремя остановиться - не проблема. Там самые разные типы... Строки, числа, массивы, объекты, бинарные данные. Структуры могут быть вложены (например массив массивов). Но все размеры известны, все можно корректно считать. Просто средство для считывания (десериализации) работает с потоками... |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |