{"id":16,"date":"2004-10-24T13:18:27","date_gmt":"2004-10-24T20:18:27","guid":{"rendered":"http:\/\/www.gubatron.com\/blog\/?p=16"},"modified":"2004-10-24T13:18:27","modified_gmt":"2004-10-24T20:18:27","slug":"c-serializando-una-lista-de-objetos-en-un-stream","status":"publish","type":"post","link":"https:\/\/www.gubatron.com\/blog\/c-serializando-una-lista-de-objetos-en-un-stream\/","title":{"rendered":"C++ Serializando una Lista de Objetos en un Stream"},"content":{"rendered":"\n<p>En la nueva implementacion de Filenger 2, fue necesario implementar serializacion de una lista. Para guardar todos los mensajes en un archivo.<\/p>\n<p><img decoding=\"async\" src=\"http:\/\/www.wedoit4you.com\/elinks\/show_image.php?Image_pk_id=820&amp;thumb=1&amp;img_height=400\" alt=\"\" \/><\/p>\n<p>La idea es hacer algo asi:<br \/>\n<code><br \/>\nQValueList&lt;Message&gt; listaDeMensajes;<br \/>\n...<br \/>\nstream &lt;&lt; listaDeMensajes; \/\/Escribe en el stream cada mensajes.<br \/>\n<\/code><\/p>\n<p>Pero las cosas no son tan sencillas, eso da un error, asi que tienes que definir el operador &lt;&lt; en la clase Message.<\/p>\n<p>Quise definir la escritura de una lista de mensajes y la lectura de la lista, para hacer<\/p>\n<p><code><br \/>\nstream &gt;&gt; listaDeMensajes;<br \/>\n<\/code><\/p>\n<p>(COMENTARIO PARA CODIGO EN FILENGER [Documentando fixes]<br \/>\nA 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 &#8211;yo me entiendo-)<\/p>\n<p><code><br \/>\nQDataStream &amp;operator&lt;&lt;(QDataStream &amp;out, const QValueList&lt;Message&gt; &amp;msgs)<br \/>\n{<br \/>\n    QValueList&lt;Message&gt;::const_iterator it = msgs.begin();<br \/>\n    out.setVersion(5);<br \/>\n    while (it != msgs.end()) {<br \/>\n\tMessage m = *it;<br \/>\n\tout &lt;&lt; m._from &lt;&lt; m._to &lt;&lt; m._cc &lt;&lt; m._bcc &lt;&lt; m._title &lt;&lt; m._message &lt;&lt; (signed char) m._useHtml;<br \/>\n\t++it;<br \/>\n    }<br \/>\n    \/\/In here we go through each element of the list and serialize it.<br \/>\n    return out;<br \/>\n}<\/code><\/p>\n<p><code><br \/>\nQDataStream &amp;operator&gt;&gt;(QDataStream &amp;in, QValueList&lt;&lt;Message&gt; &amp;msgs)<br \/>\n{<br \/>\n   msgs.clear();<br \/>\n    while (!in.atEnd()) {<br \/>\n\tMessage m;<br \/>\n\tin &gt;&gt; m._from &gt;&gt; m._to &gt;&gt; m._cc &gt;&gt; m._bcc &gt;&gt; m._title &gt;&gt; m._message &gt;&gt; (signed char)  m._useHtml;<br \/>\n\tmsgs.push_back(m);<br \/>\n    }<br \/>\n    <\/code><code><br \/>\n    return in;<br \/>\n}<br \/>\n<\/code><\/p>\n","protected":false},"excerpt":{"rendered":"<p>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&lt;Message&gt; listaDeMensajes; &#8230; stream &lt;&lt; listaDeMensajes; \/\/Escribe en el stream cada mensajes. Pero las cosas no son tan sencillas, eso da un error, asi que tienes que [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[33],"tags":[],"class_list":["post-16","post","type-post","status-publish","format-standard","hentry","category-gubatron"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p5Unzf-g","jetpack-related-posts":[{"id":14,"url":"https:\/\/www.gubatron.com\/blog\/filenger-2-ya-funciona\/","url_meta":{"origin":16,"position":0},"title":"Filenger 2, ya funciona.","author":"gubatron","date":"October 23, 2004","format":false,"excerpt":"Viva Qt y C++ (que gallo) Creo que estoy desarrollando m\u00e1s r\u00e1pido en Qt este port de Filenger de lo que me cost\u00f3 hacerlo en C#. Al parecer una vez que aprendes a programar algo de verdad en Java, a la final es como si tuvieras punteros, solo que no\u2026","rel":"","context":"In &quot;Gubatron&quot;","block_context":{"text":"Gubatron","link":"https:\/\/www.gubatron.com\/blog\/category\/gubatron\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":18,"url":"https:\/\/www.gubatron.com\/blog\/como-actuar-en-una-entrevista-de-empleo\/","url_meta":{"origin":16,"position":1},"title":"Como actuar en una entrevista de empleo","author":"gubatron","date":"October 30, 2004","format":false,"excerpt":"La gente del trabajo en White Plains, me di\u00f3 una gu\u00eda bien interesante de como actuar en una entrevista de trabajo. Ellos tienen la idea de que debes ser un vendedor, el cual no solo vende sus capacidades t\u00e9cnicas, y su intelecto, sino sus capacidades humanas, dandole a entender al\u2026","rel":"","context":"In &quot;Gubatron&quot;","block_context":{"text":"Gubatron","link":"https:\/\/www.gubatron.com\/blog\/category\/gubatron\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":11,"url":"https:\/\/www.gubatron.com\/blog\/retomando-filenger2\/","url_meta":{"origin":16,"position":2},"title":"Retomando Filenger2","author":"gubatron","date":"October 20, 2004","format":false,"excerpt":"Tiempo sin escribir, quer\u00eda hacerlo desde el s\u00e1bado pero he estado full. wedoit4you.com ahora que tiene un numero decente de visitas, ha empezado a ocasionar problemas de performance y hemos estado entonando las b\u00fasquedas y las tablas. Los chicos del hosting estaban sugieriendo que sacaran el sitio del servidor, y\u2026","rel":"","context":"In &quot;Gubatron&quot;","block_context":{"text":"Gubatron","link":"https:\/\/www.gubatron.com\/blog\/category\/gubatron\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":520,"url":"https:\/\/www.gubatron.com\/blog\/recordando-algoritmos-quicksort\/","url_meta":{"origin":16,"position":3},"title":"Recordando algoritmos, Quicksort","author":"gubatron","date":"May 17, 2007","format":false,"excerpt":"Leyendo no se que en internet, lei mencionar algo sobre preguntas de entrevistas de trabajo, y mencionaron que siempre es bueno saber como funciona Quicksort. Por algun motivo, el algoritmo de ordenamiento que siempre recuerdo es Bubble sort, pero todos sabemos que no es el mejor. So decidi repasar y\u2026","rel":"","context":"In &quot;Code&quot;","block_context":{"text":"Code","link":"https:\/\/www.gubatron.com\/blog\/category\/code\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":534,"url":"https:\/\/www.gubatron.com\/blog\/trabaja-como-desarrollador-de-software-en-new-york\/","url_meta":{"origin":16,"position":4},"title":"Trabaja como desarrollador de software en New York","author":"gubatron","date":"June 6, 2007","format":false,"excerpt":"Todas las semanas me llegan multiples correos de reclutadores ofertando excelentes posiciones en New York y zonas cercanas. En muchos de los casos me llaman por telefono, y me preguntan si conozco personas que pueden llenar esas posiciones, mi respuesta es \"No, but I know a lot of talent in\u2026","rel":"","context":"In &quot;Code&quot;","block_context":{"text":"Code","link":"https:\/\/www.gubatron.com\/blog\/category\/code\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":582,"url":"https:\/\/www.gubatron.com\/blog\/linuxcomo-copiar-un-archivo-a-multiples-ubicaciones-con-un-solo-comando\/","url_meta":{"origin":16,"position":5},"title":"Linux: Como copiar un archivo a multiples ubicaciones con un solo comando","author":"gubatron","date":"August 29, 2007","format":false,"excerpt":"Aprovecho la ocasion para ilustrar un poco el poder del bash a los amigos que recien se unen al mundo de linux. Muchas veces tienes que hacer operaciones en las cuales tienes que tocar multiples archivos, por ejemplo, remplazar un archivo en varios lugares. Yendo a un ejemplo concreto, El\u2026","rel":"","context":"In &quot;Geeklife&quot;","block_context":{"text":"Geeklife","link":"https:\/\/www.gubatron.com\/blog\/category\/geeklife\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"_links":{"self":[{"href":"https:\/\/www.gubatron.com\/blog\/wp-json\/wp\/v2\/posts\/16","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gubatron.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gubatron.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gubatron.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gubatron.com\/blog\/wp-json\/wp\/v2\/comments?post=16"}],"version-history":[{"count":0,"href":"https:\/\/www.gubatron.com\/blog\/wp-json\/wp\/v2\/posts\/16\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.gubatron.com\/blog\/wp-json\/wp\/v2\/media?parent=16"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gubatron.com\/blog\/wp-json\/wp\/v2\/categories?post=16"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gubatron.com\/blog\/wp-json\/wp\/v2\/tags?post=16"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}