Здравствуйте, niXman, Вы писали:
X>собственно говоря, корутины для этого не нужны. если ты предполагаешь отправлять в сокет каждый такой элемент, то следующий ты можешь брать в хендлере операции асинхронной записи.
Собственно это то, как оно будет реализовано на нижнем уровне — скидываем один буфер, в хэндлере async_write — запись следующего и так далее.
Вопрос в том, как это сделать в удобном виде, а не в рукопашку раскладывать сериализацию каждой структуры на хэндлеры-continutaions.
Например, у нас есть:
template<typename Archive>
void serialize(Archive &ar, Widget &x)
{
ar & x.a;
ar & x.b;
ar & x.c;
ar & x.d;
}
плюс есть буфер фиксированного размера:
array<char, 1024> fixed_buffer;
этот буфер будет передаваться по сети через async_read/async_write.
Весь Widget больше чем буфер, и за один присест его не получится отправить/получить через fixed_buffer.
Задача сделать сериализацию по кускам, но не меняя код шаблона функции serialize. На stackful coroutines это делается элементарно.
Меня же интересует — существуют ли какие-нибудь другие удобные способы?
X>но тут мне не понятно, как быть в случае, когда ты сериализуешь свое дерево, а во время охидяния хендлера происходит изменение этого дерева? или на момент когда ты начинаешь сериализовать это дерево, оно не будет изменяться до тех пор, пока сериализация не завершится?
Нет, изменение дерева не происходит. Точнее если потребуется, то при записи можно освобождать уже записанные части (делать shrink_to_fit для уже записанных массивов и т.п.)