Сериализировать и отправить структуру данных с помощью Повышения?

с помощью @pskink я наконец достиг этого кода, который может получить все данные без какой-либо ошибки. tnx all.

ArrayList<QuestionInfoHolder> result = new ArrayList<QuestionInfoHolder>();
        SQLiteDatabase db = getReadableDatabase();
        android.database.sqlite.SQLiteStatement st = db.compileStatement("SELECT Content FROM " + ARTICLES_TABLE_NAME + " WHERE ID = ?;");
        String query = "SELECT ID,CategoryID,Title,Date FROM " + ARTICLES_TABLE_NAME +";";
        Cursor cursor = db.rawQuery(query, null);
        if(cursor != null)
        {
            for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext())
            {
                st.bindLong(1, cursor.getInt(0));
                String content = st.simpleQueryForString();
                result.add(new QuestionInfoHolder(cursor.getInt(0),
                        cursor.getInt(1),
                        cursor.getString(2),
                        cursor.getString(3),
                        content));
            }
        }
20
задан Runcible 16 March 2009 в 21:19
поделиться

5 ответов

Для такой простой структуры, повышения:: сериализация является излишеством и огромными издержками.

Делают более простой:

vector<uint16_t> net(3,0);

net[0]=htons(data.m_short1);
net[1]=htons(data.m_short2);
net[2]=htons(data.character);

asio::async_write(socket,buffer((char*)&net.front(),6),callback);

vector<uint16_t> net(3,0);
asio::async_read(socket,buffer((char*)&net.front(),6),callback);

callback:
data.m_short1=ntohs(net[0]);
data.m_short2=ntohs(net[1]);
data.character=ntohs(net[2]);

И Сохраняют себя ОГРОМНЫЕ издержки, которые повышают:: сериализация имеет

И если Вы частный протокол, где компьютеры с тем же порядком работы байтов (большой/мало), которые просто отправляют структуру, как - POD.

6
ответ дан 29 November 2019 в 03:44
поделиться

Существует хорошая сериализация пример в asio документации: server.cpp, stock.hpp, connection.hpp.

Вот отрывок:

std::ostringstream archive_stream;
boost::archive::text_oarchive archive(archive_stream);
archive << your_struct;
outbound_data_ = archive_stream.str();
boost::asio::async_write(socket_, 
    boost::asio::buffer(outbound_data_), handler);
30
ответ дан 29 November 2019 в 03:44
поделиться

Вы делающий сериализацию для повышения:: архив, которые получают параметр конструктора - целевой поток, где Вы сохраните данные. Вы могли пользоваться boost.iostreams библиотекой для, определяют Ваш собственный поток, который будет отправлять данные по сети, вместо этого файл или просто использовать потоки сокета asio ( http://www.boost.org/doc/libs/1_36_0/doc/html/boost_asio/reference/ip__tcp/iostream.html ). Это - хороший путь, мы сделали что-то подобное на этом, но у нас есть немного потоков (архивируют/шифруют/отправляют) и используемое повышение iostreams библиотека для всей операции.

Легкий и фиктивный путь - хранит Ваши данные во временном файле и отправляет этот файл:)

1
ответ дан 29 November 2019 в 03:44
поделиться

Архивы сериализации повышения могут быть созданы с любым потоком. Таким образом любой oarchive может использовать любой ostream, и любой iarchive может использовать любой istream. Таким образом можно заархивировать к ostringstream, передать строку с asio и восстановить данные из этого.

Посмотрите ссылку binary_oarchive здесь , например.

1
ответ дан 29 November 2019 в 03:44
поделиться

Я подозреваю, что Вы захотите заархивировать к памяти сначала и затем записать это в сокет.

0
ответ дан 29 November 2019 в 03:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: