| Re[18]: сериализация данных | |
| От: | k732 | ||
| Дата: | 14.06.07 09:21 | ||
| Оценка: | 3 (1) | ||
| Здравствуйте, Sergey, Вы писали: S>Тогда показывай определение класса container_stream. Примерно так разделил классы
Теперь парсер (попробуй у него поменять )
на
|
| сериализация данных | |
| От: | k732 | ||
| Дата: | 13.06.07 07:48 |
| для сериализации использую boost и std::ostringstream но вся проблемма в том, что через сокет я могу передать данные только через массив байт. Получается что мне нужно прочитать в некий промежуточный буфер. После этого загнать в поток, а потом только десериализовать в объект класса. Аналогично в обратном порядке. Не слишком ли много телодвижений ? Как можно упростить все это хозяйство ? З.Ы. Есть конечно еще решение — затавить сокет работать с потоками. Но возможно ли это будет сделать ? |
| Re: сериализация данных | |
| От: | Аноним 617 | ||
| Дата: | 13.06.07 07:57 |
| Здравствуйте, k732, Вы писали: K>З.Ы. Есть конечно еще решение — затавить сокет работать с потоками. Но возможно ли это будет сделать ? Да. Нужно свои stream_buffer-а писать. А далее все сделает буст. Пример могу из дома скинуть |
| Re: сериализация данных | |
| От: | ilnar | ||
| Дата: | 13.06.07 08:07 |
| Здравствуйте, k732, Вы писали: K>для сериализации использую boost и std::ostringstream K>но вся проблемма в том, что через сокет я могу передать данные только через массив байт. K>Получается что мне нужно прочитать в некий промежуточный K>буфер. После этого загнать в поток, а потом только десериализовать в объект класса. K>Аналогично в обратном порядке. K>Не слишком ли много телодвижений ? K>Как можно упростить все это хозяйство ? K>З.Ы. Есть конечно еще решение — затавить сокет работать с потоками. Но возможно ли это будет сделать ? библиотека socket++ содержит потоковую инкапсуляцию сокетов |
| Re[2]: сериализация данных | |
| От: | k732 | ||
| Дата: | 13.06.07 08:34 |
| Здравствуйте, Аноним, Вы писали: А>Здравствуйте, k732, Вы писали: K>>З.Ы. Есть конечно еще решение — затавить сокет работать с потоками. Но возможно ли это будет сделать ? А>Да. Нужно свои stream_buffer-а писать. А далее все сделает буст. А>Пример могу из дома скинуть Буду признателен... |
| Re[2]: сериализация данных | |
| От: | k732 | ||
| Дата: | 13.06.07 08:34 |
| Здравствуйте, ilnar, Вы писали: I>Здравствуйте, k732, Вы писали: K>>для сериализации использую boost и std::ostringstream K>>но вся проблемма в том, что через сокет я могу передать данные только через массив байт. K>>Получается что мне нужно прочитать в некий промежуточный K>>буфер. После этого загнать в поток, а потом только десериализовать в объект класса. K>>Аналогично в обратном порядке. K>>Не слишком ли много телодвижений ? K>>Как можно упростить все это хозяйство ? K>>З.Ы. Есть конечно еще решение — затавить сокет работать с потоками. Но возможно ли это будет сделать ? I>библиотека socket++ содержит потоковую инкапсуляцию сокетов Это что за библиотека ? |
| Re: сериализация данных | |
| От: | Glоbus | ||
| Дата: | 13.06.07 08:39 |
| Здравствуйте, k732, Вы писали: K>для сериализации использую boost и std::ostringstream K>но вся проблемма в том, что через сокет я могу передать данные только через массив байт. K>Получается что мне нужно прочитать в некий промежуточный K>буфер. После этого загнать в поток, а потом только десериализовать в объект класса. K>Аналогично в обратном порядке. K>Не слишком ли много телодвижений ? K>Как можно упростить все это хозяйство ? K>З.Ы. Есть конечно еще решение — затавить сокет работать с потоками. Но возможно ли это будет сделать ? Попробуй сделать обертку над сокетом — например наследованием от basic_streambuf и реализовав там необходимые операции. Тогда у тебя получется создавать объекты стримов и передавать их бусту. Удачи тебе, браток! |
| Re[3]: сериализация данных | |
| От: | ilnar | ||
| Дата: | 13.06.07 08:44 |
| Здравствуйте, k732, Вы писали: K>Здравствуйте, ilnar, Вы писали: I>>Здравствуйте, k732, Вы писали: K>>>для сериализации использую boost и std::ostringstream K>>>но вся проблемма в том, что через сокет я могу передать данные только через массив байт. K>>>Получается что мне нужно прочитать в некий промежуточный K>>>буфер. После этого загнать в поток, а потом только десериализовать в объект класса. K>>>Аналогично в обратном порядке. K>>>Не слишком ли много телодвижений ? K>>>Как можно упростить все это хозяйство ? K>>>З.Ы. Есть конечно еще решение — затавить сокет работать с потоками. Но возможно ли это будет сделать ? I>>библиотека socket++ содержит потоковую инкапсуляцию сокетов K>Это что за библиотека ? а погуглить? http://www.google.ru/search?hl=ru&q=socket%2B%2B&lr= |
| Re[3]: сериализация данных | |
| От: | . | ||
| Дата: | 13.06.07 09:30 |
| k732 wrote: > А>Да. Нужно свои stream_buffer-а писать. А далее все сделает буст. > > А>Пример могу из дома скинуть > Буду признателен... Проще использвовать boost::iostreams, он всю грязную работу с stream_buffer за тебя делает. Posted via RSDN NNTP Server 2.1 beta но это не зря, хотя, может быть, невзначай гÅрмония мира не знает границ — сейчас мы будем пить чай |
| Re[2]: сериализация данных | |
| От: | k732 | ||
| Дата: | 13.06.07 10:05 |
| G>Попробуй сделать обертку над сокетом — например наследованием от basic_streambuf и реализовав там необходимые операции. Тогда у тебя получется создавать объекты стримов и передавать их бусту. нету опыта, поэтому не совсем понятно как должна выглядель полная реализация наследника basic_streambuf |
| Re[4]: сериализация данных | |
| От: | k732 | ||
| Дата: | 13.06.07 10:08 |
| .>Проще использвовать boost::iostreams, он всю грязную работу с stream_buffer за тебя делает. в идеале хотелось бы иметь stream с функциональностью вектора и с непрерывной памятью для того, чтоб можно было бы писать прям в поток. а что позволяет boost::iostreams ? первый раз слышу |
| Re[5]: сериализация данных | |
| От: | Sergey | ||
| Дата: | 13.06.07 10:17 |
| "k732" <57436@users.rsdn.ru> wrote in message news:2543709@news.rsdn.ru... >.>Проще использвовать boost::iostreams, он всю грязную работу с stream_buffer за тебя делает. > > в идеале хотелось бы иметь stream с функциональностью вектора и с непрерывной памятью > для того, чтоб можно было бы писать прям в поток. > > а что позволяет boost::iostreams ? первый раз слышу boost::iostreams позволяет получить stream_buffer, реализовав всего лишь функции std::streamsize read(char_type* s, std::streamsize n) и/или std::streamsize write(const char_type* s, std::streamsize n); Posted via RSDN NNTP Server 2.1 beta На улицах злая гопота, в офисах злые гомосеки. Как выжить в этом городе простому человеку? |
| Re[6]: сериализация данных | |
| От: | k732 | ||
| Дата: | 13.06.07 10:37 |
| Здравствуйте, Sergey, Вы писали: S>boost::iostreams позволяет получить stream_buffer, реализовав всего лишь функции std::streamsize read(char_type* s, std::streamsize n) и/или S>std::streamsize write(const char_type* s, std::streamsize n); Sergey, если не очень сложно — можно примерчик, а то я не совсем понял о чем идет речь |
| Re[7]: сериализация данных | |
| От: | . | ||
| Дата: | 13.06.07 10:39 |
| k732 wrote: > Sergey, если не очень сложно — можно примерчик, а то я не совсем понял о > чем идет речь http://boost.org/libs/iostreams/doc/index.html Posted via RSDN NNTP Server 2.1 beta но это не зря, хотя, может быть, невзначай гÅрмония мира не знает границ — сейчас мы будем пить чай |
| Re[8]: сериализация данных | |
| От: | k732 | ||
| Дата: | 13.06.07 11:17 |
| Здравствуйте, ., Вы писали: .>k732 wrote: >> Sergey, если не очень сложно — можно примерчик, а то я не совсем понял о >> чем идет речь .>http://boost.org/libs/iostreams/doc/index.html тоесть нужна будет специализация для std::basic_streambuf или std::stream_buffer Только не совсем понятно как это решит мою проблемму. Ведь нужно нудет как-то писать в сокет. Если у сокета есть методы read/write, то они хотят кусок памяти и знают сколько нужно считать/записать. Каким боком сюда потоки прилепить ? Можно псевдо код. Я просто туго понимаю что Вы хотите сказать этой библиотекой |
| Re[8]: сериализация данных | |
| От: | k732 | ||
| Дата: | 13.06.07 11:23 |
| Здравствуйте, ., Вы писали: .>k732 wrote: >> Sergey, если не очень сложно — можно примерчик, а то я не совсем понял о >> чем идет речь .>http://boost.org/libs/iostreams/doc/index.html Хотя там есть такая хрень как basic_array. Может про это речь ? |
| Re[9]: сериализация данных | |
| От: | . | ||
| Дата: | 13.06.07 11:48 |
| k732 wrote: >> > Sergey, если не очень сложно — можно примерчик, а то я не совсем понял о >> > чем идет речь > .>http://boost.org/libs/iostreams/doc/index.html > Хотя там есть такая хрень как basic_array. Может про это речь ? Дык почитай хоть немного, там на первых страницах уже всё есть. http://boost.org/libs/iostreams/doc/tutorial/container_sink.html Posted via RSDN NNTP Server 2.1 beta но это не зря, хотя, может быть, невзначай гÅрмония мира не знает границ — сейчас мы будем пить чай |
| Re[9]: сериализация данных | |
| От: | Sergey | ||
| Дата: | 13.06.07 12:09 |
| "k732" <57436@users.rsdn.ru> wrote in message news:2543943@news.rsdn.ru... > Здравствуйте, ., Вы писали: > > .>k732 wrote: > >>> Sergey, если не очень сложно — можно примерчик, а то я не совсем понял о >>> чем идет речь > .>http://boost.org/libs/iostreams/doc/index.html > > тоесть нужна будет специализация для std::basic_streambuf или std::stream_buffer > > Только не совсем понятно как это решит мою проблемму. Ведь нужно нудет как-то писать в сокет. > Если у сокета есть методы read/write, то они хотят кусок памяти и знают сколько нужно считать/записать. > > Каким боком сюда потоки прилепить ? > > Можно псевдо код. Я просто туго понимаю что Вы хотите сказать этой библиотекой Делаешь класс device — класс, функция write которого умеет писать в сокет. Кусок хедера из реального проекта:
Обратите внимание на наличие struct category : boost::iostreams::sink_tag {}; — это чтоб буст понял, что это sink device. Дальше пишешь:
Собственно, на этом все — теперь у нас есть rpcOutStreamBuffer, который можно скормить стриму:
Соответственно, при записи в поток s данные в конечном счете попадут в rpcOutStreamBufDev::write, где и будут записаны в сокет. Posted via RSDN NNTP Server 2.1 beta На улицах злая гопота, в офисах злые гомосеки. Как выжить в этом городе простому человеку? |
| Re[10]: сериализация данных | |
| От: | k732 | ||
| Дата: | 13.06.07 12:55 |
| Здравствуйте, ., Вы писали: .>k732 wrote: >>> > Sergey, если не очень сложно — можно примерчик, а то я не совсем понял о >>> > чем идет речь >> .>http://boost.org/libs/iostreams/doc/index.html >> Хотя там есть такая хрень как basic_array. Может про это речь ? .>Дык почитай хоть немного, там на первых страницах уже всё есть. .>http://boost.org/libs/iostreams/doc/tutorial/container_sink.html Если ты имеешь ввиду это
тоесть реально я буду писать в вектор, а в архив отдавать его оберну в container_sink ? |
| Re[10]: сериализация данных | |
| От: | k732 | ||
| Дата: | 13.06.07 12:57 |
| Здравствуйте, Sergey, Вы писали: S>"k732" <57436@users.rsdn.ru> wrote in message news:2543943@news.rsdn.ru... >> Здравствуйте, ., Вы писали: >> >> .>k732 wrote: >> >>>> Sergey, если не очень сложно — можно примерчик, а то я не совсем понял о >>>> чем идет речь >> .>http://boost.org/libs/iostreams/doc/index.html >> >> тоесть нужна будет специализация для std::basic_streambuf или std::stream_buffer >> >> Только не совсем понятно как это решит мою проблемму. Ведь нужно нудет как-то писать в сокет. >> Если у сокета есть методы read/write, то они хотят кусок памяти и знают сколько нужно считать/записать. >> >> Каким боком сюда потоки прилепить ? >> >> Можно псевдо код. Я просто туго понимаю что Вы хотите сказать этой библиотекой S>Делаешь класс device — класс, функция write которого умеет писать в сокет. Кусок хедера из реального проекта: S>
S>Обратите внимание на наличие struct category : boost::iostreams::sink_tag {}; — это чтоб буст понял, что это sink device. S>Дальше пишешь: S>
S>Собственно, на этом все — теперь у нас есть rpcOutStreamBuffer, который можно скормить стриму: S>
S>Соответственно, при записи в поток s данные в конечном счете попадут в rpcOutStreamBufDev::write, где и будут записаны в сокет. Спасибо за код. Буду разбираться. С записью понятно — заранее известен размер данных. А как с чтением, если размер данных, которые прийдут не известен (или будет известен только из заголовка пакета) |
| Re[11]: сериализация данных | |
| От: | Sergey | ||
| Дата: | 13.06.07 13:24 |
| > Спасибо за код. Буду разбираться. > С записью понятно — заранее известен размер данных. А как с чтением, если размер данных, которые прийдут не известен (или будет известен только из заголовка пакета) Ну а кто мешает просто пытаться читать сколько просят? Или на уровне device отслеживать заголовки пакетов? В общем, какой протокол придумаете, так и будет работать. Если у вас уже что-то работает с копированием данных в промежуточный буфер, то не составит большого труда переделать это на использование стримов. Posted via RSDN NNTP Server 2.1 beta На улицах злая гопота, в офисах злые гомосеки. Как выжить в этом городе простому человеку? |
| Re[12]: сериализация данных | |
| От: | k732 | ||
| Дата: | 13.06.07 13:28 |
| Здравствуйте, Sergey, Вы писали: >> Спасибо за код. Буду разбираться. >> С записью понятно — заранее известен размер данных. А как с чтением, если размер данных, которые прийдут не известен (или будет известен только из заголовка пакета) S>Ну а кто мешает просто пытаться читать сколько просят? Или на уровне device отслеживать заголовки пакетов? В общем, какой протокол придумаете, так и будет работать. Тоесть всегда просить максимум ? Если у вас уже что-то работает с копированием данных в промежуточный буфер, то не составит большого труда переделать это на использование стримов. С промежеточным буером работает. А вот как сразу писать в поток, чтоб потом десериализовать — пока не соображу |
| Re[11]: сериализация данных | |
| От: | . | ||
| Дата: | 13.06.07 13:36 |
| k732 wrote: > тоесть реально я буду писать в вектор, Куда сделаешь, туда и будешь писать. Ты сам определяешь куда писать в методе write. Например, в сокет будет примерно так:
> а в архив отдавать его оберну в container_sink ? Ниче не понял. Posted via RSDN NNTP Server 2.1 beta но это не зря, хотя, может быть, невзначай гÅрмония мира не знает границ — сейчас мы будем пить чай |
| Re[12]: сериализация данных | |
| От: | k732 | ||
| Дата: | 13.06.07 13:38 |
| Здравствуйте, ., Вы писали: >> а в архив отдавать его оберну в container_sink ? .>Ниче не понял. Блин — тогда я совсем запутался Никогда просто с потоками не работал.... |
| Re[13]: сериализация данных | |
| От: | Sergey | ||
| Дата: | 13.06.07 13:56 |
| >>> Спасибо за код. Буду разбираться. >>> С записью понятно — заранее известен размер данных. А как с чтением, если размер данных, которые прийдут не известен (или будет известен только из заголовка пакета) > > S>Ну а кто мешает просто пытаться читать сколько просят? Или на уровне device отслеживать заголовки пакетов? В общем, какой протокол придумаете, так и будет работать. > > > Тоесть всегда просить максимум ? > > Если у вас уже что-то работает с копированием данных в промежуточный буфер, то не составит большого труда переделать это на использование стримов. > > > С промежеточным буером работает. А вот как сразу писать в поток, чтоб потом десериализовать — пока не соображу Сколько просить — зависит от того, как у вас устроена десериализация. Лучше всего опишите, как оно сейчас работает — тогда может что-нибудь и придумается. Принимаете пакет (длина — в заголовке), складываете его в буфер — это я понял. А дальше что с ним делаете? Posted via RSDN NNTP Server 2.1 beta На улицах злая гопота, в офисах злые гомосеки. Как выжить в этом городе простому человеку? |
| Re[14]: сериализация данных | |
| От: | k732 | ||
| Дата: | 13.06.07 15:04 |
| S>Сколько просить — зависит от того, как у вас устроена десериализация. Лучше всего опишите, как оно сейчас работает — тогда может что-нибудь и придумается. Принимаете пакет (длина — в заголовке), складываете его в буфер — это я понял. А дальше что с ним делаете? ну работает так. Я сериализую класс и получаю массив байт (ну например достаю из потока). У сокета есть методы read/write
Для того, чтоб было понятно сколько запрашивать данных, в начале каждого блока идет заголовок.
Работает все хозяйство по принципу запрос-ответ. Например. Клиент запрашивает данные, отправляя заголовок с нужным кодом. Сервер всегда знает размер заголовка, по.тому читает его. Далее сериализует данные и отправляет сначала заголовок, в котором говорит размер данных, а потом данные. Клиент прочитав заголовок, понимает сколько нужно ждать данных. Читает их и десериализует. Так вот раньше сериализация и десериализация выполнялась руками. Это много кода и я решил прикрутить boost. Но вся проблемма в том, что класс сокет читает и пишет в память (прототип я привел), а бусттовский архив работает с потоками. Так вот и возник вопрос чтения и записи сразу в поток. Но писать понятно как, а вот читать... |
| Re[13]: сериализация данных | |
| От: | . | ||
| Дата: | 13.06.07 15:21 |
| k732 wrote: >> > а в архив отдавать его оберну в container_sink ? > .>Ниче не понял. Архив принимает ostream, а sink им и является. > > Блин — тогда я совсем запутался > Никогда просто с потоками не работал.... А что тут такого... read, write, очень похоже на сокеты. Просто тебе не обязательно в начале передавать размер данных, и даже не обязательно знать этот размер. Концом пакета можно сделать, скажем '\0' или если это xml, то закрытие последнего тега. А вообще, работать напрямую с сокетами в наше время немного несовременно, есть куча протоколов, хоть тот же http например, которые многое упрощают. С сокетами работать приходится в крайних ситуациях, когда к системе предъявляют очень серьёзные требования быстродействия. Posted via RSDN NNTP Server 2.1 beta но это не зря, хотя, может быть, невзначай гÅрмония мира не знает границ — сейчас мы будем пить чай |
| Re[14]: сериализация данных | |
| От: | k732 | ||
| Дата: | 13.06.07 15:27 |
| Здравствуйте, ., Вы писали: .>А что тут такого... read, write, очень похоже на сокеты. .>Просто тебе не обязательно в начале передавать размер данных, и даже не обязательно знать этот размер. Концом пакета .>можно сделать, скажем '\0' или если это xml, то закрытие последнего тега. .>А вообще, работать напрямую с сокетами в наше время немного несовременно, есть куча протоколов, хоть тот же http .>например, которые многое упрощают. С сокетами работать приходится в крайних ситуациях, когда к системе предъявляют очень .>серьёзные требования быстродействия. Да как-то поперло еще давно. Переделывать не хочется. Много завязано на классах. Надо просто прикрутить boost. Может конечно есть и проще решение. Может также и писать в память а просто потом заставить архив сериализовать его. Это можно сделать ? Наверное нужны обертки или вот я нашел там что-то похожее basic_array который может и сможет помоч |
| Re[15]: сериализация данных | |
| От: | . | ||
| Дата: | 13.06.07 15:45 |
| k732 wrote: > Да как-то поперло еще давно. Переделывать не хочется. Много завязано на > классах. > Надо просто прикрутить boost. Определяешь методы read/write чтобы они валили всё в сокет и всё вроде... Но размер-то тебе неизвестен, если ты используешь заголовок с длиной, то ничего не получится. Или есть какой-то способ вычислить размер данных до генерации до сериализации? > Может конечно есть и проще решение. Может также и писать в память > а просто потом заставить архив сериализовать его. Это можно сделать ? А какого примерно размера пакеты? > Наверное нужны обертки или вот я нашел там что-то похожее basic_array > который может и сможет помоч Да, можно. Хотя ведь есть std::stringstream, но он несколько неоптимально с памятью работает... Posted via RSDN NNTP Server 2.1 beta но это не зря, хотя, может быть, невзначай гÅрмония мира не знает границ — сейчас мы будем пить чай |
| Re[16]: сериализация данных | |
| От: | k732 | ||
| Дата: | 13.06.07 15:59 |
| Здравствуйте, ., Вы писали: .>k732 wrote: .>Определяешь методы read/write чтобы они валили всё в сокет и всё вроде... Но размер-то тебе неизвестен, если ты .>используешь заголовок с длиной, то ничего не получится. Или есть какой-то способ вычислить размер данных до генерации до .>сериализации? к сожалению нет. >> Может конечно есть и проще решение. Может также и писать в память >> а просто потом заставить архив сериализовать его. Это можно сделать ? .>А какого примерно размера пакеты? данные могут быть любой длинны >> Наверное нужны обертки или вот я нашел там что-то похожее basic_array >> который может и сможет помоч .>Да, можно. Хотя ведь есть std::stringstream, но он несколько неоптимально с памятью работает... единственное меня смутило, что basic_array это обертка над памятью фиксированного размера. Тоесть после ее создания размер не пожет менятся. А это значит что можно только десериализовать с помощью ее. Блин да почему все так сложно в такой мощной библиотеке. Мне данные в чистом виде не нужны. Нужен лишь десериализованный объект. А приходится работать побайтно. А чем может помоч http и есть ли он в boost ? |
| Re[12]: сериализация данных | |
| От: | k732 | ||
| Дата: | 13.06.07 16:56 |
| Здравствуйте, ., Вы писали: .>k732 wrote: >> тоесть реально я буду писать в вектор, .>Куда сделаешь, туда и будешь писать. Ты сам определяешь куда писать в методе write. Например, в сокет будет примерно так: .>
>> а в архив отдавать его оберну в container_sink ? .>Ниче не понял. 1. так container_sink и container_source решат проблемму ? (просто там приведены общие примеры для контейнеров и не совсем понятно нужно ли самому писать или они уже написали обший для оборачивания контейнера) 2. И можно ли сразу и для записи и для чтения сделать ? 3. Может уже есть такие шаблоны для контейнеров ? 4. Какой контейнер лучше использовать ? там примеры
и
|
| Re[17]: сериализация данных | |
| От: | . | ||
| Дата: | 13.06.07 17:58 |
| k732 wrote: > .>Определяешь методы read/write чтобы они валили всё в сокет и всё > вроде... Но размер-то тебе неизвестен, если ты > .>используешь заголовок с длиной, то ничего не получится. Или есть > какой-то способ вычислить размер данных до генерации до > .>сериализации? > к сожалению нет. А если постараться? Ибо это невозможно только в редких случаях, например, при передаче потока видео с камеры, данные просто "бесконечны". >> > Может конечно есть и проще решение. Может также и писать в память >> > а просто потом заставить архив сериализовать его. Это можно сделать ? > .>А какого примерно размера пакеты? > данные могут быть любой длинны Ну в смысле 3 гигабайта может быть? Тогда у тебя в принципе не получится всё сериализовать в память (по крайней мере на x86). >> > Наверное нужны обертки или вот я нашел там что-то похожее basic_array >> > который может и сможет помоч > .>Да, можно. Хотя ведь есть std::stringstream, но он несколько > неоптимально с памятью работает... > единственное меня смутило, что basic_array это обертка над памятью > фиксированного размера. > Тоесть после ее создания размер не пожет менятся. А это значит что можно > только десериализовать с помощью ее. Так там просто пример, что поток вокруг чего угодно можно навернуть... В доке, что я посылал тебе выше, есть код для оборачивания любого контейнера, имеющего insert, есть код для std::string, чем не нравится? Можешь прикрутить std::vector. > Блин да почему все так сложно в такой мощной библиотеке. Мне данные в > чистом виде не нужны. > Нужен лишь десериализованный объект. А приходится работать побайтно. Так просто там всё. Просто твоя задача слишком простая, что конкретно её никто решать не собирается, там обобщённое решение, разберись. > А чем может помоч http и есть ли он в boost ? В бусте нету. А чем помочь — это протокол, к которому есть куча библиотек для работы с ним, позволяет передавать данные с некой метаинформацией, позволяет легко перейти на использование защищённого канала (https), бегать через прокси и т.п. Т.е. не надо придумывать как передать длину — есть content-length, не нужно придумывать как передать тип инфы — есть content-type. Легко прикручивается gzip для компрессии, можно кэши настраивать. В общем куча преимуществ готового и отлаженного решения. Posted via RSDN NNTP Server 2.1 beta но это не зря, хотя, может быть, невзначай гÅрмония мира не знает границ — сейчас мы будем пить чай |
| Re[13]: сериализация данных | |
| От: | . | ||
| Дата: | 13.06.07 18:11 |
| k732 wrote: > 1. так container_sink и container_source решат проблемму ? (просто там > приведены общие примеры для контейнеров и не совсем понятно нужно ли > самому писать или они уже написали обший для оборачивания контейнера) Да я не знаю.. Вроде всё написано. Или с английским плохо?
> 2. И можно ли сразу и для записи и для чтения сделать ? Можно. Там всё написано. http://boost.org/libs/iostreams/doc/tutorial/container_device.html > 3. Может уже есть такие шаблоны для контейнеров ? Какие именно "такие"? > 4. Какой контейнер лучше использовать ? Самый лучший. Короче, у тебя теоретических знаний не хватает, по-моему. понятие, а не связанное с С++. Поизучай Haskell что-ли... Posted via RSDN NNTP Server 2.1 beta но это не зря, хотя, может быть, невзначай гÅрмония мира не знает границ — сейчас мы будем пить чай |
| Re[15]: сериализация данных | |
| От: | Sergey | ||
| Дата: | 13.06.07 18:49 |
| Здравствуйте, k732, Вы писали: S>>Сколько просить — зависит от того, как у вас устроена десериализация. Лучше всего опишите, как оно сейчас работает — тогда может что-нибудь и придумается. Принимаете пакет (длина — в заголовке), складываете его в буфер — это я понял. А дальше что с ним делаете? K>Работает все хозяйство по принципу запрос-ответ. K>Например. Клиент запрашивает данные, отправляя заголовок с нужным кодом. K>Сервер всегда знает размер заголовка, по.тому читает его. Далее сериализует данные и K>отправляет сначала заголовок, в котором говорит размер данных, а потом данные. K>Клиент прочитав заголовок, понимает сколько нужно ждать данных. Читает их и десериализует. K>Так вот раньше сериализация и десериализация выполнялась руками. Это много кода и я решил прикрутить boost. K>Но вся проблемма в том, что класс сокет читает и пишет в память (прототип я привел), а бусттовский архив работает с потоками. K>Так вот и возник вопрос чтения и записи сразу в поток. Но писать понятно как, а вот читать... А, так это boost::serialization. Она читает не больше, чем ей реально нужно данных — т.е., если запрашиваемые данные не пришли, это ошибка и разумным будет подождать некоторое время и по истечении таймаута выставить ошибку и вернуть 0. Есть правда небольшая проблема — стримы буферизирует данные, т.е., если архив попытался прочитать 305 байт, в device::read придет требование например, на 4k данных. Поэтому придется установить эти буферы равного размера на обоих концах и в начале каждого пакета передавать длину. Только пакетом будет уже не все сообщние (длину которого на момент начала передачи вы не знаете), а то, что пришло в device::write. На улицах злая гопота, в офисах злые гомосеки. Как выжить в этом городе простому человеку? |
| Re: сериализация данных | |
| От: | ArtDenis | ||
| Дата: | 14.06.07 04:57 |
| k732 пишет: > > Не слишком ли много телодвижений ? Намана Представь себе, что ты сериализуешь данные по следующему алгоритму: 1. Блокировка изменения данных 2. Сериализация в буфер 3. Разблокировка изменения данных 4. Отправка в сокет В этом случае у тебя данные блокируются на минимальное время, которое можно принять за константу. Если ты будешь сразу отправлять данные в сокет, то есть вероятность, что время между блокировкой и разблокировкой данных возрастёт в зависимости от состояния и загруженности физического канала, используемого сокетом для передачи данных. Причём величина этой задержки может быть какой угодно. Возрастание времени, в течении которого нельзя изменять данные может сказать на быстродействии программы. Для реального времени это недопустимо, т.к. там такая задержка может нарушить работу алгоритмов. Так что сериализация в буфер, а затем отправка содержимого буфера — IMHO самый оптимальный вариант. Posted via RSDN NNTP Server 2.1 beta www.jimm.org — бесплатная аська для сотовых |
| Re[10]: сериализация данных | |
| От: | k732 | ||
| Дата: | 14.06.07 06:25 |
| Здравствуйте, Sergey, Вы писали: Поробовал я так сделать как ты говорил, только я как в примере сделал
Вроде все сварилось кроме сериализации
Но говорит, что не почет конвертнуть sstream в std::ostream. |
| Re[11]: сериализация данных | |
| От: | Sergey | ||
| Дата: | 14.06.07 07:04 |
| "k732" <57436@users.rsdn.ru> wrote in message news:2545323@news.rsdn.ru... > Здравствуйте, Sergey, Вы писали: > > Поробовал я так сделать как ты говорил, только > я как в примере сделал > >
> > Вроде все сварилось кроме сериализации seekable тут излишен. Хотя реализовать его над вектором и не составит труда. Но не над сокетами. > > >
> > Но говорит, что не почет конвертнуть sstream в std::ostream. Говорит, что &stream — указатель на функцию? Бывает
Posted via RSDN NNTP Server 2.1 beta На улицах злая гопота, в офисах злые гомосеки. Как выжить в этом городе простому человеку? |
| Re[12]: сериализация данных | |
| От: | k732 | ||
| Дата: | 14.06.07 07:12 |
| Здравствуйте, Sergey, Вы писали: S>seekable тут излишен. Хотя реализовать его над вектором и не составит труда. Но не над сокетами. А какой tag нужен тогда для read/write S>Говорит, что &stream — указатель на функцию? Бывает S>
Не помогло
|
| Re[13]: сериализация данных | |
| От: | Sergey | ||
| Дата: | 14.06.07 07:27 |
| > S>seekable тут излишен. Хотя реализовать его над вектором и не составит труда. Но не над сокетами. > А какой tag нужен тогда для read/write Для write — sink_tag, для read — source_tag. Оба сразу — bidirectional_device_tag, но с ним в 1.33.1 баги были. Исправили ли их в 1.34, не знаю. Вообще, если заглянуть в boost\iostreams\categories.hpp, то взаимоотношения между категориями станут более понятными. >
> А char_type у sstream какой? Posted via RSDN NNTP Server 2.1 beta На улицах злая гопота, в офисах злые гомосеки. Как выжить в этом городе простому человеку? |
| Re[14]: сериализация данных | |
| От: | k732 | ||
| Дата: | 14.06.07 07:36 |
| Здравствуйте, Sergey, Вы писали: S>Для write — sink_tag, для read — source_tag. Оба сразу — bidirectional_device_tag, но с ним в 1.33.1 баги были. Исправили ли их в 1.34, не знаю. S>Вообще, если заглянуть в boost\iostreams\categories.hpp, то взаимоотношения между категориями станут более понятными. спасибо S>А char_type у sstream какой? он определен через typedef T::char_type
тоесть должен быть unsigned char |
| Re[15]: сериализация данных | |
| От: | Sergey | ||
| Дата: | 14.06.07 07:40 |
| > S>А char_type у sstream какой? > он определен через typedef T::char_type > >
> > тоесть должен быть unsigned char > А чтобы скомпилировалось, должен быть просто char — либо вместо std::ostream надо использовать std::basic_ostream<unsigned char> — но не факт, что последнее понравится boost::serialization. Posted via RSDN NNTP Server 2.1 beta На улицах злая гопота, в офисах злые гомосеки. Как выжить в этом городе простому человеку? |
| Re[3]: сериализация данных | |
| От: | Glоbus | ||
| Дата: | 14.06.07 07:45 |
| Здравствуйте, k732, Вы писали: G>>Попробуй сделать обертку над сокетом — например наследованием от basic_streambuf и реализовав там необходимые операции. Тогда у тебя получется создавать объекты стримов и передавать их бусту. K>нету опыта, поэтому не совсем понятно как должна выглядель полная реализация наследника basic_streambuf Знач так... 1. Реализуем свой буфер для работы с сокетом.
2. Используем #include "stdafx.h" #include "SockStreamBuf.h" int main(int argc, char* argv[]) { CSockStreamBuf< char > sockBuf( "194.67.57.26", 80 ); //это коннект к mail.ru std::basic_iostream< char > stream( &sockBuf ); //создаем поток и далее работаем уже только сним std::string sData = "GET http://mail.ru/ HTTP/1.1\r\nAccept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*\r\nAccept-Language: ru\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.0.3705)\r\nHost: localhost\r\nProxy-Connection: Keep-Alive\r\n\r\n"; stream.write( sData.c_str(), sData.length() ); //отсылаем запрос char buf[1024] = {0}; stream.read( buf, 1024 ); //получаем ответ. return 0; } Удачи тебе, браток! |
| Re[16]: сериализация данных | |
| От: | k732 | ||
| Дата: | 14.06.07 08:23 |
| Здравствуйте, Sergey, Вы писали: S>А чтобы скомпилировалось, должен быть просто char — либо вместо std::ostream надо использовать std::basic_ostream<unsigned char> — но не факт, что последнее понравится boost::serialization. но тогда для всей этой кухни нет различий от std::ostringstream А именно от этого я хотел уйти. Ведь зачем городить было огород, если можно было просто загнать буфер в std::ostringstream ? |
| Re[16]: сериализация данных | |
| От: | k732 | ||
| Дата: | 14.06.07 08:30 |
| Здравствуйте, Sergey, Вы писали: S>А чтобы скомпилировалось, должен быть просто char — либо вместо std::ostream надо использовать std::basic_ostream<unsigned char> — но не факт, что последнее понравится boost::serialization. попробова. ему не нравится ни то ни другое |
| Re[17]: сериализация данных | |
| От: | Sergey | ||
| Дата: | 14.06.07 08:35 |
| > S>А чтобы скомпилировалось, должен быть просто char — либо вместо std::ostream надо использовать std::basic_ostream<unsigned char> — но не факт, что последнее понравится boost::serialization. > > но тогда для всей этой кухни нет различий от std::ostringstream > А именно от этого я хотел уйти. Ведь зачем городить было огород, если можно было просто загнать буфер > в std::ostringstream ? А я-то думал, что ты стрим над сокетом собирался делать Posted via RSDN NNTP Server 2.1 beta На улицах злая гопота, в офисах злые гомосеки. Как выжить в этом городе простому человеку? |
| Re[17]: сериализация данных | |
| От: | Sergey | ||
| Дата: | 14.06.07 08:36 |
| "k732" <57436@users.rsdn.ru> wrote in message news:2545524@news.rsdn.ru... > Здравствуйте, Sergey, Вы писали: > > S>А чтобы скомпилировалось, должен быть просто char — либо вместо std::ostream надо использовать std::basic_ostream<unsigned char> — но не факт, что последнее понравится boost::serialization. > > попробова. ему не нравится ни то ни другое Тогда показывай определение класса container_stream. Posted via RSDN NNTP Server 2.1 beta На улицах злая гопота, в офисах злые гомосеки. Как выжить в этом городе простому человеку? |
| Re[18]: сериализация данных | |
| От: | k732 | ||
| Дата: | 14.06.07 09:19 |
| Здравствуйте, Sergey, Вы писали: S>А я-то думал, что ты стрим над сокетом собирался делать Так я так и не понял как читадь данные из потока, если неизвестна длигга данных. Пока делаю только с дополнительным заголовком фиксированного размера |
| Re[19]: сериализация данных | |
| От: | Sergey | ||
| Дата: | 14.06.07 10:27 |
| > Теперь парсер (попробуй у него поменять ) >
> на >
Если заодно не забыть поменять и std::basic_ostream <unsigned char> ostream (&stream); на std::ostream ostream (&stream);то все замечательно скомпилируется. По крайней мере, на MSVC 8 sp1. Posted via RSDN NNTP Server 2.1 beta На улицах злая гопота, в офисах злые гомосеки. Как выжить в этом городе простому человеку? |
| Re[19]: сериализация данных | |
| От: | Sergey | ||
| Дата: | 14.06.07 10:37 |
| "k732" <57436@users.rsdn.ru> wrote in message news:2545620@news.rsdn.ru... > Здравствуйте, Sergey, Вы писали: > > S>А я-то думал, что ты стрим над сокетом собирался делать > > Так я так и не понял как читадь данные из потока, если неизвестна длигга данных. > Пока делаю только с дополнительным заголовком фиксированного размера > Ну так одно другому не помеха. Просто заголовок можно передавать не 1 на всю сериализацию, а запихать его формирование в write и чтение — в read. Только это должен быть очень маленький заголовок — например, просто длина текущего пакета. Впрочем, если объем передаваемых данных невелик, можно с потоками над сокетами не заморачиваться и просто strstream'ом ограничится. Posted via RSDN NNTP Server 2.1 beta На улицах злая гопота, в офисах злые гомосеки. Как выжить в этом городе простому человеку? |
| Re[20]: сериализация данных | |
| От: | k732 | ||
| Дата: | 14.06.07 10:40 |
| Здравствуйте, Sergey, Вы писали: S>Если заодно не забыть поменять и std::basic_ostream <unsigned char> ostream (&stream); на std::ostream ostream (&stream);то все замечательно скомпилируется. По крайней мере, на MSVC 8 sp1. писал прям здесь, поэтому не то закоментировал. Если unsigned char, то не дружит std::basic_ostream но даже если просто char
то вот результат (компилятор тотже, но без sp1)
|
| Re[21]: сериализация данных | |
| От: | Sergey | ||
| Дата: | 14.06.07 11:22 |
>
> Это похоже что хедера какого-то не хватает. Причем не для стримов, а для сериализации. Можно попробовать скомпилировать то же просто со stringstream — думаю, будут те же ошибки. Posted via RSDN NNTP Server 2.1 beta На улицах злая гопота, в офисах злые гомосеки. Как выжить в этом городе простому человеку? |
| Re[22]: сериализация данных | |
| От: | k732 | ||
| Дата: | 14.06.07 15:02 |
| Здравствуйте, Sergey, Вы писали: S>Это похоже что хедера какого-то не хватает. Причем не для стримов, а для сериализации. Можно попробовать скомпилировать то же просто со stringstream — думаю, будут те же ошибки. Оказалось все проще. Нужно было поменять местами <iostream> и <fstream> при подключении. Правда не совсем понял почему. Ну да ладно. Вроде сварилось с одним варнингом. У меня все-таки есть вопрос 1. Можно ли это сделать для std::basic_ostream <unsigned char> ? Просто меня смущаем char. Боюсь будут проблеммы например с '\0' и т.п. 2. Я один раз отключал для сериалицации варнинг
Но сейчас появился еще один. Критичен ли он ? И что он опять хочет от меня
|
| Re[23]: сериализация данных | |
| От: | Sergey | ||
| Дата: | 14.06.07 18:37 |
| Здравствуйте, k732, Вы писали: K>Ну да ладно. Вроде сварилось с одним варнингом. K>У меня все-таки есть вопрос K>1. Можно ли это сделать для std::basic_ostream <unsigned char> ? Можно. Но, по всей видимости, придется инстанцировать архивы для типа unsigned char — при стандартной сборке буста они собираются только для char и wchar_t. Там есть кучка фалов с расширением ipp — придется включить их в проект и проинстацировать все шаблонные классы, на которые будет ругаться линкер. В общем, возни много, толку мало. K>Просто меня смущаем char. Боюсь будут проблеммы например с '\0' и т.п. С бинарной сериализаций никаких проблем из-за этого быть не должно. С текстовой сериализацией проблемы с нулями посреди строк будут в любом случае, независимо от того, char или unsigned char используется. А проблемы с бустовой сериализацией бывают совсем из-за другого... K>2. Я один раз отключал для сериалицации варнинг K>
K>Но сейчас появился еще один. Критичен ли он ? И что он опять хочет от меня K>
Ну это мокрософты решили что char_traits::move — функция небезопасная, ну и ругаются на эту тему. Можно просто определить макрос _SCL_SECURE_NO_WARNINGS — тогда это предупреждение (и подобные) должны пропасть. На улицах злая гопота, в офисах злые гомосеки. Как выжить в этом городе простому человеку? |
| Re[24]: сериализация данных | |
| От: | k732 | ||
| Дата: | 14.06.07 18:41 |
| Здравствуйте, Sergey, Вы писали: S>Ну это мокрософты решили что char_traits::move — функция небезопасная, ну и ругаются на эту тему. Можно просто определить макрос _SCL_SECURE_NO_WARNINGS — тогда это предупреждение (и подобные) должны пропасть. в самом деле помогло (но только часть ошибок)
остались
|