Re[18]: сериализация данных в избранное  новое    подписка   модер. 
От: k732 
Дата: 14.06.07 09:21
Оценка:3 (1)
Здравствуйте, Sergey, Вы писали:

S>Тогда показывай определение класса container_stream.


Примерно так
разделил классы

template<typename Container>
class rcontainer {
private:
    typedef typename Container::size_type   size_type;
    const Container&  m_container;
    size_type   m_index;

public:
    typedef typename Container::value_type    char_type;
    typedef boost::iostreams::source_tag    category;

    rcontainer (const Container& container) : m_container(container), m_index(0) { }
    ~rcontainer () { }

    std::streamsize read (char_type* value, std::streamsize size)
    {
        std::streamsize delta = static_cast<std::streamsize> (
            m_container.size() - m_index
        );

        std::streamsize result = std::min<std::streamsize> (size, delta);
        if (!result) return -1;

        std::copy (
            m_container.begin() + m_index,
            m_container.begin() + m_index + result, value
        );
        m_index += result;
        return result;
    }
};
/* -------------------------------------------------------------------------- */
template<typename Container>
class wcontainer {
private:
    typedef typename Container::size_type   size_type;
    Container&  m_container;
    size_type   m_index;

public:
    typedef typename Container::value_type    char_type;
    typedef boost::iostreams::sink_tag        category;

    wcontainer (Container& container)  : m_container(container), m_index(0) { }
    ~wcontainer () { }

    std::streamsize write (const char_type* value, std::streamsize size)
    {
        m_container.insert(m_container.end(), value, value + size);
        return size;
    }
};


Теперь парсер (попробуй у него поменять )
typedef std::vector<unsigned char> sbuffer;

на
typedef std::vector<char> sbuffer;


namespace parser
{
    /* ---------------------------------------------------------------------- */
    typedef std::vector<unsigned char> sbuffer;
    typedef rcontainer <sbuffer> rdevice;
    typedef wcontainer <sbuffer> wdevice;
    /* ---------------------------------------------------------------------- */
    template <class T>
    inline void serialize (sbuffer& buffer, const T& rhs)
    {
        try
        {
            namespace bio = boost::iostreams;

            wdevice device (buffer);
            bio::stream_buffer<wdevice> stream (device);
            std::basic_ostream <unsigned char> ostream (&stream);
            //std::ostream ostream (&stream);

            boost::archive::binary_oarchive archive(ostream);
            archive << BOOST_SERIALIZATION_NVP (rhs);

        }
        catch (std::exception& ex)
        {
            std::cerr << ex.what() << std::endl;
        }
    }
    /* ---------------------------------------------------------------------- */
    template <class T>
    inline void deserialize (const sbuffer& buffer, T& rhs)
    {
        try
        {
            namespace bio = boost::iostreams;

            rdevice device (buffer);
            bio::stream_buffer<rdevice> stream (device);
            std::istream istream (&stream);


            boost::archive::binary_iarchive archive (istream);
            archive >> BOOST_SERIALIZATION_NVP (rhs);
        }
        catch (std::exception& ex)
        {
            std::cerr << ex.what() << std::endl;
        }
    }
    /* ---------------------------------------------------------------------- */
}
сериализация данных в избранное  новое    модер. 
От: 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 которого умеет писать в сокет. Кусок хедера из реального проекта:

class RPCLIB_API rpcOutStreamBufDev: public rpcStreamBaseDevice

{

public:

rpcOutStreamBufDev(rpcStreamData&,rpcOutStreamData&);

virtual ~rpcOutStreamBufDev();

struct category : boost::iostreams::sink_tag {};


std::streamsize write(const char_type* s, std::streamsize n);

void FinishRPC();

private:

std::streamsize DoWrite(const char_type* s, std::streamsize n);

rpcOutStreamData* outStreamData_;

};


Обратите внимание на наличие struct category : boost::iostreams::sink_tag {}; — это чтоб буст понял, что это sink device.

Дальше пишешь:


typedef boost::iostreams::stream_buffer<rpcOutStreamBufDev> rpcOutStreamBuffer;


Собственно, на этом все — теперь у нас есть rpcOutStreamBuffer, который можно скормить стриму:


rpcOutStreamData outData;

rpcOutStreamBufDev outDevice(commonDataForOut,outData);

rpcOutStreamBuffer outStreamBuf(outDevice, 0x10000);

std::ostream s(&outStreamBuf);


Соответственно, при записи в поток 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

Если ты имеешь ввиду это

#include <algorithm>                       // copy, min
#include <iosfwd>                          // streamsize
#include <boost/iostreams/categories.hpp>  // sink_tag

namespace boost { namespace iostreams { namespace example {

template<typename Container>
class container_sink {
public:
    typedef typename Container::value_type  char_type;
    typedef sink_tag                        category;
    container_sink(Container& container) : container_(container) { }
    std::streamsize write(const char_type* s, std::streamsize n)
    {
        container_.insert(container_.end(), s, s + n);
        return n;
    }
    Container& container() { return container_; }
private:
    Container& container_;
};

} } } // End namespace boost::iostreams:example


тоесть реально я буду писать в вектор, а в архив отдавать его оберну в 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>class RPCLIB_API rpcOutStreamBufDev: public rpcStreamBaseDevice

S>{

S>public:

S>rpcOutStreamBufDev(rpcStreamData&,rpcOutStreamData&);

S>virtual ~rpcOutStreamBufDev();

S>struct category : boost::iostreams::sink_tag {};


S>std::streamsize write(const char_type* s, std::streamsize n);

S>void FinishRPC();

S>private:

S>std::streamsize DoWrite(const char_type* s, std::streamsize n);

S>rpcOutStreamData* outStreamData_;

S>};

S>


S>Обратите внимание на наличие struct category : boost::iostreams::sink_tag {}; — это чтоб буст понял, что это sink device.


S>Дальше пишешь:


S>

S>typedef boost::iostreams::stream_buffer<rpcOutStreamBufDev> rpcOutStreamBuffer;

S>


S>Собственно, на этом все — теперь у нас есть rpcOutStreamBuffer, который можно скормить стриму:


S>

S>rpcOutStreamData outData;

S>rpcOutStreamBufDev outDevice(commonDataForOut,outData);

S>rpcOutStreamBuffer outStreamBuf(outDevice, 0x10000);

S>std::ostream s(&outStreamBuf);

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. Например, в сокет будет примерно так:
 >     std::streamsize write(const char_type* s, std::streamsize n)
 >     {
mysocket_.write(s, n);
 >         return n;
 >     }


> а в архив отдавать его оберну в container_sink ?

Ниче не понял. Архив принимает ostream, а sink им и является.
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[12]: сериализация данных в избранное  новое    модер. 
От: k732 
Дата: 13.06.07 13:38
Здравствуйте, ., Вы писали:

>> а в архив отдавать его оберну в container_sink ?

.>Ниче не понял. Архив принимает ostream, а 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

std::size_t Socket::read  (unsigned char buffer[], std::size_t size);
std::size_t Socket::write (unsigned char buffer[], std::size_t size);


Для того, чтоб было понятно сколько запрашивать данных, в начале каждого блока идет заголовок.


enum TYPE    { ... };
enum SUBTYPE    { ... };
enum RESULT    { ... ;
enum STATE    { ... };

struct HEADER 
{
    TYPE    type;
    SUBTYPE    subtype;
    COMMAND    command;
    union 
    {
        unsigned value;
        RESULT     result;
        STATE     state;
    };

    HEADER () : type ((TYPE)0), subtype ((SUBTYPE)0),
        command ((COMMAND)0), value (0){}
    HEADER (TYPE wfType, SUBTYPE wfSubtype, COMMAND wfCommand)
        : type (wfType), subtype (wfSubtype), command (wfCommand), value (0){}
    ~HEADER() {}

};



Работает все хозяйство по принципу запрос-ответ.

Например. Клиент запрашивает данные, отправляя заголовок с нужным кодом.
Сервер всегда знает размер заголовка, по.тому читает его. Далее сериализует данные и
отправляет сначала заголовок, в котором говорит размер данных, а потом данные.
Клиент прочитав заголовок, понимает сколько нужно ждать данных. Читает их и десериализует.

Так вот раньше сериализация и десериализация выполнялась руками. Это много кода и я решил прикрутить 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. Например, в сокет будет примерно так:
.>
 >>     std::streamsize write(const char_type* s, std::streamsize n)
 >>     {
.>mysocket_.write(s, n);
 >>         return n;
 >>     }
.>


>> а в архив отдавать его оберну в container_sink ?

.>Ниче не понял. Архив принимает ostream, а sink им и является.

1. так container_sink и container_source решат проблемму ? (просто там приведены общие примеры для контейнеров и не совсем понятно нужно ли самому писать или они уже написали обший для оборачивания контейнера)
2. И можно ли сразу и для записи и для чтения сделать ?
3. Может уже есть такие шаблоны для контейнеров ?
4. Какой контейнер лучше использовать ?

там примеры

namespace boost { namespace iostreams { namespace example {

template<typename Container>
class container_sink {
public:
    typedef typename Container::value_type  char_type;
    typedef sink_tag                        category;
    container_sink(Container& container) : container_(container) { }
    std::streamsize write(const char_type* s, std::streamsize n)
    {
        container_.insert(container_.end(), s, s + n);
        return n;
    }
    Container& container() { return container_; }
private:
    Container& container_;
};

} } } // End namespace boost::iostreams:example


и

template<typename Container>
class container_source {
public:
    typedef typename Container::value_type  char_type;
    typedef source_tag                      category;
    container_source(Container& container) 
        : container_(container), pos_(0)
        { }
    std::streamsize read(char_type* s, std::streamsize n)
    {
        using namespace std;
        streamsize amt = static_cast<streamsize>(container_.size() - pos_);
        streamsize result = (min)(n, amt);
        if (result != 0) {
            std::copy( container_.begin() + pos_, 
                       container_.begin() + pos_ + result, 
                       s );
            pos_ += result;
            return result;
        } else {
            return -1; // EOF
        }
    }
    Container& container() { return container_; }
private:
    typedef typename Container::size_type   size_type;
    Container&  container_;
    size_type   pos_;
};

} } } // End namespace boost::iostreams:example
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 решат проблемму ? (просто там

> приведены общие примеры для контейнеров и не совсем понятно нужно ли
> самому писать или они уже написали обший для оборачивания контейнера)
Да я не знаю.. Вроде всё написано. Или с английским плохо?

Suppose you want to write a Device for appending characters to an STL container.


> 2. И можно ли сразу и для записи и для чтения сделать ?

Можно. Там всё написано.
http://boost.org/libs/iostreams/doc/tutorial/container_device.html

> 3. Может уже есть такие шаблоны для контейнеров ?

Какие именно "такие"?

> 4. Какой контейнер лучше использовать ?

Самый лучший.

Короче, у тебя теоретических знаний не хватает, по-моему. Что такое stream даже не понимаешь, именно как абстрактное
понятие, а не связанное с С++.
Поизучай 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: сериализация данных в избранное  новое    модер. 
От: ArtDenishttp://www.jimm.org/?ru
Дата: 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, Вы писали:

Поробовал я так сделать как ты говорил, только
я как в примере сделал

typedef boost::iostreams::seekable_device_tag  category;


Вроде все сварилось кроме сериализации


typedef std::vector <unsigned char> sbuffer;
typedef container_stream <sbuffer> sdevice;
typedef boost::iostreams::stream_buffer<sdevice> sstream;

namespase parser
{
    template <class T>
    inline void serialize (sbuffer& buffer, const T& rhs)
    {
        try
        {
            sstream stream (sdevice (buffer));
            std::ostream ostream (&stream);
            boost::archive::binary_oarchive archive (ostream);
            archive << BOOST_SERIALIZATION_NVP (rhs);
        }
        catch (std::exception& ex)
        {
             std::cerr << ex.what() << std::endl;
        }
    }
}


Но говорит, что не почет конвертнуть 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, Вы писали:
>
> Поробовал я так сделать как ты говорил, только
> я как в примере сделал
>
>
> typedef boost::iostreams::seekable_device_tag  category;
>

>
> Вроде все сварилось кроме сериализации

seekable тут излишен. Хотя реализовать его над вектором и не составит труда. Но не над сокетами.

>

>
>
> typedef std::vector <unsigned char> sbuffer;
> typedef container_stream <sbuffer> sdevice;
> typedef boost::iostreams::stream_buffer<sdevice> sstream;
> 
> namespase parser
> {
>    template <class T>
>    inline void serialize (sbuffer& buffer, const T& rhs)
>    {
>        try
>        {
>            sstream stream (sdevice (buffer));
>            std::ostream ostream (&stream);
>            boost::archive::binary_oarchive archive (ostream);
>            archive << BOOST_SERIALIZATION_NVP (rhs);
>        }
>        catch (std::exception& ex)
>        {
>             std::cerr << ex.what() << std::endl;
>        }
>    }
> }
> 
>

>
> Но говорит, что не почет конвертнуть sstream в std::ostream.

Говорит, что &stream — указатель на функцию? Бывает Создай именованный объект sdevice, и оно скомпиляется:
        sdevice dev(buffer);
        sstream stream (dev);
        std::ostream 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 — указатель на функцию? Бывает Создай именованный объект sdevice, и оно скомпиляется:

S>
S>        sdevice dev(buffer);
S>        sstream stream (dev);
S>        std::ostream ostream (&stream);
S>


Не помогло

: error C2664: 'std::basic_ostream<_Elem,_Traits>::basic_ostream(std::basic_streambuf<_Elem,_Traits> *,bool)' : cannot convert parameter 1 from 'parser::sstream *__w64 ' to 'std::basic_streambuf<_Elem,_Traits> *'
2>        with
2>        [
2>            _Elem=char,
2>            _Traits=std::char_traits<char>
2>        ]
2>        Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
2>        .\xxx.cpp(104) : see reference to function template instantiation 'void
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, то взаимоотношения между категориями станут более понятными.

>
> : error C2664: 'std::basic_ostream<_Elem,_Traits>::basic_ostream(std::basic_streambuf<_Elem,_Traits> *,bool)' : cannot convert parameter 1 from 'parser::sstream *__w64 ' to 'std::basic_streambuf<_Elem,_Traits> *'
> 2>        with
> 2>        [
> 2>            _Elem=char,
> 2>            _Traits=std::char_traits<char>
> 2>        ]
> 2>        Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
> 2>        .\xxx.cpp(104) : see reference to function template instantiation 'void
> 
>

>

А 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

typedef std::vector <unsigned char> sbuffer;
typedef container_stream <sbuffer> sdevice;
typedef boost::iostreams::stream_buffer<sdevice> sstream;


тоесть должен быть unsigned char
Re[15]: сериализация данных в избранное  новое    модер. 
От: Sergey 
Дата: 14.06.07 07:40
> S>А char_type у sstream какой?
> он определен через typedef T::char_type
>
>
> typedef std::vector <unsigned char> sbuffer;
> typedef container_stream <sbuffer> sdevice;
> typedef boost::iostreams::stream_buffer<sdevice> sstream;
>

>
> тоесть должен быть 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


Знач так... Ну вобщем я вот тут накидал примерец — там реализованы не все функции basic_streambuf-a, но читать/писать оно умеет, так что я думаю будет понятно. Мож если кто чего мудрого еще решит добавить — пишите.


1. Реализуем свой буфер для работы с сокетом.
// SockStreamBuf.h

#ifndef CSockStramBuf__H
#define CSockStramBuf__H

#include <iosfwd>
#include <Winsock2.h>
#include <string>

template
    <
    class Elem,
    class Tr = std::char_traits< Elem >
    >
class CSockStreamBuf : public std::basic_streambuf< Elem, Tr >
{
public:
    CSockStreamBuf( const std::string& sAddr, int iPort );
    virtual ~CSockStreamBuf();

    int GetState() const;

    //Implementing basic_streambuf
    int_type pbackfail( int_type =  Tr::eof() );
    std::streamsize xsputn( const char_type *buf, std::streamsize iCount );
    std::streamsize xsgetn( char_type *buf,    std::streamsize iCount );
    std::streamsize _Xsgetn_s( char_type *buf,    size_t iSize, std::streamsize iCount    );




private:
    int Connect( const std::string& sAddr, int iPort );
    bool Disconnect();

    std::string m_sAddr;
    int m_iPort;
    SOCKET m_Sock;
    int m_iState;
};

template< class Elem, class Tr >
typename CSockStreamBuf<Elem,Tr>::int_type CSockStreamBuf<Elem,Tr>::pbackfail(int_type /* = Tr::eof()  */)
{
    return Tr::eof();
}

template< class Elem, class Tr >
std::streamsize CSockStreamBuf< Elem, Tr >::_Xsgetn_s( char_type *buf,    size_t iSize, std::streamsize iCount    )
{
    std::streamsize iRes = this->xsgetn( buf, iCount );
    return iRes;
}

template< class Elem, class Tr >
std::streamsize CSockStreamBuf< Elem, Tr >::xsputn( const typename CSockStreamBuf< Elem, Tr >::char_type *buf, std::streamsize iCount )
{
    std::streamsize iRes = send( m_Sock, buf, iCount, 0 );
    return iRes;
}

template< class Elem, class Tr >
std::streamsize CSockStreamBuf< Elem,Tr >::xsgetn( typename CSockStreamBuf< Elem, Tr >::char_type *buf, std::streamsize iCount )
{
    std::streamsize iRes = recv( m_Sock, buf, iCount, 0 );
    return iRes;
}

template< class Elem, class Tr >
CSockStreamBuf<Elem,Tr>::CSockStreamBuf( const std::string& sAddr, int iPort )
{
    this->Connect( sAddr, iPort );
}

template< class Elem, class Tr >
CSockStreamBuf<Elem,Tr>::~CSockStreamBuf()
{
    this->Disconnect();
}


template<class Elem, class Tr>
int CSockStreamBuf<Elem,Tr>::Connect( const std::string& sAddr, int iPort )
{
    //init winsock
    WSADATA wsaData;
    m_iState = WSAStartup(MAKEWORD(2,2), &wsaData);
    if( m_iState == NO_ERROR )
    {
        //creating socket
        SOCKET ConnectSocket;
        ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if( ConnectSocket != INVALID_SOCKET )
        {
            //creating address object
            sockaddr_in sockAddr;
            sockAddr.sin_family = AF_INET;
            sockAddr.sin_addr.s_addr = inet_addr( sAddr.c_str() );
            sockAddr.sin_port = htons( iPort );
            //connecting
            m_iState = connect( ConnectSocket, (SOCKADDR*)&sockAddr, sizeof( sockAddr ) ) ;
            if( m_iState != SOCKET_ERROR )
            {
                m_sAddr = sAddr;
                m_iPort = iPort;
                m_Sock = ConnectSocket;
            }//if
        }//if
        else
        {
            m_iState = SOCKET_ERROR;
        }//else
    }//if
    return m_iState;
}

template< class Elem, class Tr >
bool CSockStreamBuf<Elem,Tr>::Disconnect()
{
    bool bRes = true;
    if( m_Sock != INVALID_SOCKET )
    {
        bRes = closesocket( m_Sock ) == 0; 
        
    }//if
    WSACleanup();
    return bRes;
}



#endif CSockStramBuf__H


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
> Теперь парсер (попробуй у него поменять )
>
> typedef std::vector<unsigned char> sbuffer;
>

> на
>
> typedef std::vector<char> sbuffer;
>


Если заодно не забыть поменять и 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

            namespace bio = boost::iostreams;

            wdevice device (buffer);
            bio::stream_buffer<wdevice> stream (device);
            std::ostream ostream (&stream);

            boost::archive::binary_oarchive archive(ostream);
            archive << BOOST_SERIALIZATION_NVP (rhs);


то вот результат (компилятор тотже, но без sp1)


2>C:\boost\boost/iostreams/detail/streambuf/indirect_streambuf.hpp(241) : warning C4996: 'std::char_traits<char>::move' was declared deprecated
2>        C:\Program Files\Microsoft Visual Studio 8\VC\include\iosfwd(470) : see declaration of 'std::char_traits<char>::move'
2>        Message: 'You have used a std:: construct that is not safe. See documentation on how to use the Safe Standard C++ Library'
2>        C:\boost\boost/iostreams/detail/streambuf/indirect_streambuf.hpp(230) : while compiling class template member function 'int boost::iostreams::detail::indirect_streambuf<T,Tr,Alloc,Mode>::underflow(void)'
2>        with
2>        [
2>            T=parser::wdevice,
2>            Tr=std::char_traits<char>,
2>            Alloc=std::allocator<char>,
2>            Mode=boost::iostreams::detail::io_mode_impl<2>::type
2>        ]
2>        C:\boost\boost/iostreams/stream_buffer.hpp(64) : see reference to class template instantiation 'boost::iostreams::detail::indirect_streambuf<T,Tr,Alloc,Mode>' being compiled
2>        with
2>        [
2>            T=parser::wdevice,
2>            Tr=std::char_traits<char>,
2>            Alloc=std::allocator<char>,
2>            Mode=boost::iostreams::detail::io_mode_impl<2>::type
2>        ]
2>        xxx.h(171) : see reference to class template instantiation 'boost::iostreams::stream_buffer<T>' being compiled
2>        with
2>        [
2>            T=parser::wdevice
2>        ]
2>        .\dataspy.cpp(104) : see reference to function template instantiation 'void parser::serialize<Channels>(parser::sbuffer &,const T &)' being compiled
2>        with
2>        [
2>            T=Channels
2>        ]
2>C:\Program Files\Microsoft Visual Studio 8\VC\include\xutility(2282) : warning C4996: 'std::_Copy_opt' was declared deprecated
2>        C:\Program Files\Microsoft Visual Studio 8\VC\include\xutility(2270) : see declaration of 'std::_Copy_opt'
2>        Message: 'You have used a std:: construct that is not safe. See documentation on how to use the Safe Standard C++ Library'
2>        e:\software\visual\atheros\wcl\stream.h(98) : see reference to function template instantiation '_OutIt std::copy<std::_Vector_const_iterator<_Ty,_Alloc>,char*>(_InIt,_InIt,_OutIt)' being compiled
2>        with
2>        [
2>            _OutIt=char *,
2>            _Ty=char,
2>            _Alloc=std::allocator<char>,
2>            _InIt=std::_Vector_const_iterator<char,std::allocator<char>>
2>        ]

...
...
...

2>        xxx.h(176) : see reference to function template instantiation 'Archive &boost::archive::detail::interface_oarchive<Archive>::operator <<<const boost::serialization::nvp<T>>(const boost::serialization::nvp<T> &)' being compiled
2>        with
2>        [
2>            Archive=boost::archive::binary_oarchive,
2>            T=const Channels
2>        ]
2>C:\boost\boost/archive/detail/oserializer.hpp(132) : error C2955: 'boost::type' : use of class template requires template argument list
2>        C:\boost\boost/type.hpp(14) : see declaration of 'boost::type'
2>C:\boost\boost/archive/detail/oserializer.hpp(132) : error C2039: 'value' : is not a member of 'boost::type'
2>        C:\boost\boost/type.hpp(14) : see declaration of 'boost::type'
2>C:\boost\boost/archive/detail/oserializer.hpp(132) : error C2065: 'value' : undeclared identifier
Re[21]: сериализация данных в избранное  новое    модер. 
От: Sergey 
Дата: 14.06.07 11:22
>
> 2>C:\boost\boost/iostreams/detail/streambuf/indirect_streambuf.hpp(241) : warning C4996: 'std::char_traits<char>::move' was declared deprecated
> 2>        C:\Program Files\Microsoft Visual Studio 8\VC\include\iosfwd(470) : see declaration of 'std::char_traits<char>::move'
> 2>        Message: 'You have used a std:: construct that is not safe. See documentation on how to use the Safe Standard C++ Library'
> 2>        C:\boost\boost/iostreams/detail/streambuf/indirect_streambuf.hpp(230) : while compiling class template member function 'int boost::iostreams::detail::indirect_streambuf<T,Tr,Alloc,Mode>::underflow(void)'
> 2>        with
> 2>        [
> 2>            T=parser::wdevice,
> 2>            Tr=std::char_traits<char>,
> 2>            Alloc=std::allocator<char>,
> 2>            Mode=boost::iostreams::detail::io_mode_impl<2>::type
> 2>        ]
> 2>        C:\boost\boost/iostreams/stream_buffer.hpp(64) : see reference to class template instantiation 'boost::iostreams::detail::indirect_streambuf<T,Tr,Alloc,Mode>' being compiled
> 2>        with
> 2>        [
> 2>            T=parser::wdevice,
> 2>            Tr=std::char_traits<char>,
> 2>            Alloc=std::allocator<char>,
> 2>            Mode=boost::iostreams::detail::io_mode_impl<2>::type
> 2>        ]
> 2>        xxx.h(171) : see reference to class template instantiation 'boost::iostreams::stream_buffer<T>' being compiled
> 2>        with
> 2>        [
> 2>            T=parser::wdevice
> 2>        ]
> 2>        .\dataspy.cpp(104) : see reference to function template instantiation 'void parser::serialize<Channels>(parser::sbuffer &,const T &)' being compiled
> 2>        with
> 2>        [
> 2>            T=Channels
> 2>        ]
> 2>C:\Program Files\Microsoft Visual Studio 8\VC\include\xutility(2282) : warning C4996: 'std::_Copy_opt' was declared deprecated
> 2>        C:\Program Files\Microsoft Visual Studio 8\VC\include\xutility(2270) : see declaration of 'std::_Copy_opt'
> 2>        Message: 'You have used a std:: construct that is not safe. See documentation on how to use the Safe Standard C++ Library'
> 2>        e:\software\visual\atheros\wcl\stream.h(98) : see reference to function template instantiation '_OutIt std::copy<std::_Vector_const_iterator<_Ty,_Alloc>,char*>(_InIt,_InIt,_OutIt)' being compiled
> 2>        with
> 2>        [
> 2>            _OutIt=char *,
> 2>            _Ty=char,
> 2>            _Alloc=std::allocator<char>,
> 2>            _InIt=std::_Vector_const_iterator<char,std::allocator<char>>
> 2>        ]
> 
> ...
> ...
> ...
> 
> 2>        xxx.h(176) : see reference to function template instantiation 'Archive &boost::archive::detail::interface_oarchive<Archive>::operator <<<const boost::serialization::nvp<T>>(const boost::serialization::nvp<T> &)' being compiled
> 2>        with
> 2>        [
> 2>            Archive=boost::archive::binary_oarchive,
> 2>            T=const Channels
> 2>        ]
> 2>C:\boost\boost/archive/detail/oserializer.hpp(132) : error C2955: 'boost::type' : use of class template requires template argument list
> 2>        C:\boost\boost/type.hpp(14) : see declaration of 'boost::type'
> 2>C:\boost\boost/archive/detail/oserializer.hpp(132) : error C2039: 'value' : is not a member of 'boost::type'
> 2>        C:\boost\boost/type.hpp(14) : see declaration of 'boost::type'
> 2>C:\boost\boost/archive/detail/oserializer.hpp(132) : error C2065: 'value' : undeclared identifier
>

>

Это похоже что хедера какого-то не хватает. Причем не для стримов, а для сериализации. Можно попробовать скомпилировать то же просто со 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. Я один раз отключал для сериалицации варнинг

# pragma warning (disable : 4267)


Но сейчас появился еще один. Критичен ли он ? И что он опять хочет от меня



C:\boost\boost/iostreams/detail/streambuf/indirect_streambuf.hpp(241) : warning C4996: 'std::char_traits<char>::move' was declared deprecated
        C:\Program Files\Microsoft Visual Studio 8\VC\include\iosfwd(470) : see declaration of 'std::char_traits<char>::move'
        Message: 'You have used a std:: construct that is not safe. See documentation on how to use the Safe Standard C++ Library'
        C:\boost\boost/iostreams/detail/streambuf/indirect_streambuf.hpp(230) : while compiling class template member function 'int boost::iostreams::detail::indirect_streambuf<T,Tr,Alloc,Mode>::underflow(void)'
        with
        [
            T=parser::wdevice,
            Tr=std::char_traits<char>,
            Alloc=std::allocator<char>,
            Mode=boost::iostreams::detail::io_mode_impl<2>::type
        ]
        C:\boost\boost/iostreams/stream_buffer.hpp(64) : see reference to class template instantiation 'boost::iostreams::detail::indirect_streambuf<T,Tr,Alloc,Mode>' being compiled
        with
        [
            T=parser::wdevice,
            Tr=std::char_traits<char>,
            Alloc=std::allocator<char>,
            Mode=boost::iostreams::detail::io_mode_impl<2>::type
        ]
        parser.h(179) : see reference to class template instantiation 'boost::iostreams::stream_buffer<T>' being compiled
        with
        [
            T=parser::wdevice
        ]
        (104) : see reference to function template instantiation 'void parser::serialize<Channels>(parser::sbuffer &,const T &)' being compiled
        with
        [
            T=Channels
        ]
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># pragma warning (disable : 4267)
K>


K>Но сейчас появился еще один. Критичен ли он ? И что он опять хочет от меня


K>
K>C:\boost\boost/iostreams/detail/streambuf/indirect_streambuf.hpp(241) : warning C4996: 'std::char_traits<char>::move' was declared deprecated
K>        C:\Program Files\Microsoft Visual Studio 8\VC\include\iosfwd(470) : see declaration of 'std::char_traits<char>::move'
K>        Message: 'You have used a std:: construct that is not safe. See documentation on how to use the Safe Standard C++ Library'
K>        C:\boost\boost/iostreams/detail/streambuf/indirect_streambuf.hpp(230) : while compiling class template member function 'int boost::iostreams::detail::indirect_streambuf<T,Tr,Alloc,Mode>::underflow(void)'
K>        with
K>        [
K>            T=parser::wdevice,
K>            Tr=std::char_traits<char>,
K>            Alloc=std::allocator<char>,
K>            Mode=boost::iostreams::detail::io_mode_impl<2>::type
K>        ]
K>        C:\boost\boost/iostreams/stream_buffer.hpp(64) : see reference to class template instantiation 'boost::iostreams::detail::indirect_streambuf<T,Tr,Alloc,Mode>' being compiled
K>        with
K>        [
K>            T=parser::wdevice,
K>            Tr=std::char_traits<char>,
K>            Alloc=std::allocator<char>,
K>            Mode=boost::iostreams::detail::io_mode_impl<2>::type
K>        ]
K>        parser.h(179) : see reference to class template instantiation 'boost::iostreams::stream_buffer<T>' being compiled
K>        with
K>        [
K>            T=parser::wdevice
K>        ]
K>        (104) : see reference to function template instantiation 'void parser::serialize<Channels>(parser::sbuffer &,const T &)' being compiled
K>        with
K>        [
K>            T=Channels
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 — тогда это предупреждение (и подобные) должны пропасть.


в самом деле помогло (но только часть ошибок)

        std::copy (
            m_container.begin() + m_index,
            m_container.begin() + m_index + result,
            stdext::checked_array_iterator<char_type *> (value, result)
        );


остались

C:\boost\boost/iostreams/detail/streambuf/indirect_streambuf.hpp(241) : warning C4996: 'std::char_traits<char>::move' was declared deprecated
        C:\Program Files\Microsoft Visual Studio 8\VC\include\iosfwd(470) : see declaration of 'std::char_traits<char>::move'
        Message: 'You have used a std:: construct that is not safe. See documentation on how to use the Safe Standard C++ Library'
        C:\boost\boost/iostreams/detail/streambuf/indirect_streambuf.hpp(230) : while compiling class template member function 'int boost::iostreams::detail::indirect_streambuf<T,Tr,Alloc,Mode>::underflow(void)'
        with
        [
            T=parser::wdevice,
            Tr=std::char_traits<char>,
            Alloc=std::allocator<char>,
            Mode=boost::iostreams::detail::io_mode_impl<2>::type
        ]
        C:\boost\boost/iostreams/stream_buffer.hpp(64) : see reference to class template instantiation 'boost::iostreams::detail::indirect_streambuf<T,Tr,Alloc,Mode>' being compiled
        with
        [
            T=parser::wdevice,
            Tr=std::char_traits<char>,
            Alloc=std::allocator<char>,
            Mode=boost::iostreams::detail::io_mode_impl<2>::type
        ]
        e:\wcl\parser.h(179) : see reference to class template instantiation 'boost::iostreams::stream_buffer<T>' being compiled
        with
        [
            T=parser::wdevice
        ]
        .\data.cpp(104) : see reference to function template instantiation 'void parser::serialize<Channels>(parser::sbuffer &,const T &)' being compiled
        with
        [
            T=Channels
        ]