C++ Serializando una Lista de Objetos en un Stream

En la nueva implementacion de Filenger 2, fue necesario implementar serializacion de una lista. Para guardar todos los mensajes en un archivo.

La idea es hacer algo asi:

QValueList<Message> listaDeMensajes;
...
stream << listaDeMensajes; //Escribe en el stream cada mensajes.

Pero las cosas no son tan sencillas, eso da un error, asi que tienes que definir el operador << en la clase Message.

Quise definir la escritura de una lista de mensajes y la lectura de la lista, para hacer


stream >> listaDeMensajes;

(COMENTARIO PARA CODIGO EN FILENGER [Documentando fixes]
A la final, no me resulta tan bien eso de leer toda la lista de mensajes pq que si tienes unos 100mb de mensajes enviados, no es la idea cargarlos todos en memoria, para agregar un elemento, y volver a guardar, asi que probablemente me desaga del operador de escritura, y cuando vaya a guardar un mensaje, lo serializo campo por campo, haciendo Append –yo me entiendo-)


QDataStream &operator<<(QDataStream &out, const QValueList<Message> &msgs)
{
QValueList<Message>::const_iterator it = msgs.begin();
out.setVersion(5);
while (it != msgs.end()) {
Message m = *it;
out << m._from << m._to << m._cc << m._bcc << m._title << m._message << (signed char) m._useHtml;
++it;
}
//In here we go through each element of the list and serialize it.
return out;
}


QDataStream &operator>>(QDataStream &in, QValueList<<Message> &msgs)
{
msgs.clear();
while (!in.atEnd()) {
Message m;
in >> m._from >> m._to >> m._cc >> m._bcc >> m._title >> m._message >> (signed char) m._useHtml;
msgs.push_back(m);
}

return in;
}

Leave a Reply

Your email address will not be published. Required fields are marked *