serialización serializacion que programacion ejemplo deserializacion datos crear archivo c++ serialization boost binary

c++ - que - serializacion y deserializacion en java



La serialización binaria de Boost no funciona ocasionalmente. La información analizada está corrupta a veces (1)

Lo siento mucho por publicar esta pregunta. La serialización binaria de refuerzo funciona como se esperaba. Acabo de cometer un pequeño error, pero no lo encontré hasta hace unos minutos.

Probablemente soy el programador más estúpido del mundo. En mi función, utilizo un parámetro bool identity_file_in_binary para permitir que el usuario elija si se prefiere un archivo binario. Luego .open() cláusula if-else para ejecutar .open() en modo diferente. Debería haber estado usando iso_base::binary en el ámbito if pero erróneamente ponerlo en el ámbito else . Después de corregir este error, mi programa funcionó sin problemas.

PD: He pasado 2 días buscando el origen de mi problema, durante el cual he revisado la cláusula errónea if-else muchas veces pero he pasado por alto el error. ¿Cómo pudo pasar esto? ¿Alguien tiene algunas buenas ideas para prevenir este tipo de errores?

Con un motivo desconocido, la serialización binaria de refuerzo no funciona ocasionalmente. Los datos analizados están dañados a veces.

Originalmente, serialicé instancias de clase autodefinida manualmente, siendo cada instancia una línea en un archivo de texto. Sin embargo, la velocidad era lenta. (El archivo de texto se repartió a una velocidad de 2 MB / seg., Que se puede ver en el administrador de tareas de Windows). Recientemente modifiqué para usar la serialización binaria boost. Sin embargo, cosas extrañas suceden.

Almacenaba muchas instancias de clase InstanceIdentity, que contiene una variable de miembro de cadena y una variable de miembro de estructura que representa las coordenadas de entero xyz.

Mi problema: las instancias 504 anteriores pueden analizarse correctamente desde el archivo binario e imprimirse en la pantalla. Sin embargo, la instancia 505a se analiza falsamente (las coordenadas xyz no deben ser más de 512). Y las siguientes instancias se convierten en un desastre. Y pronto se genera una excepción desconocida de boost. Traté de atraparlo y usé el método .what () para revelar más información. Sin embargo, solo dice Unknown Exception .

line 503: 029_4_.s_raw.gz (306, 215, 64) line 504: 029_4_.s_raw.gz (224, 154, 86) line 505: 029_4_.s_raw.gz (68109, 36608, 16384) // Then the screen output becomes a mess. I can''t even copy the mess here.

Mis pruebas para resolverlo.

  1. Revisé esta página http://boost-users.boost.narkive.com/70Yjldp7/boost-serialization-throws-random-exceptions . Y me aseguré de que ifstream y ofstream se abrieran como binarios:

    out_file_stream.open (file_name, ios_base :: out | ios_base :: binary);

    in_file_stream.open (file_name, ios_base :: in | ios_base :: binary);

Pero el problema continúa

  1. Traté de serializar los mismos datos en el archivo de texto usando boost. (Solo es necesario cambiar el modo de abrir archivo y aumentar el tipo de archivo).

Los datos se pueden serializar y deserializar con éxito a través de un archivo de texto. Dado que esto probablemente implica la corrección de la función serializar en mi clase autodefinida InstanceIdentity, el problema de aumentar la serialización binaria se vuelve más extraño.

  1. Abrí el archivo binario boost en el editor hexadecimal (complemento notepad ++) y traté de encontrar algo en las instancias 505.ª El hex de las coordenadas xyz de la 504ª instancia es:

    // primera instancia xyz

    169 = 0xA9 144 = 0x90 79 = 0x4F

    // Y puedo encontrar 00 00 00 a9 00 00 00 90 00 00 00 4f en la ubicación adecuada.

    // 502a instancia xyz

    137 = 0x89 268 = 0x10C 136 = 0x88

    // Pero no puedo encontrar 00 00 00 89 00 00 01 0c 00 00 00 88 en todo el archivo binario, incluso si esta instancia se analiza correctamente mediante boost.

    // 503a instancia xyz

    306 = 0x132 215 = 0xD7 64 = 0x40

    // Pero no puedo encontrar 00 00 01 32 00 00 00 d7 00 00 00 40 en todo el archivo binario, incluso si esta instancia se analiza correctamente mediante boost.

    // 504a instancia xyz

    224 = 0xE0 154 = 0x9A 86 = 0x56

    00 00 00 e0 00 00 00 9a 00 00 00 56

    // Pero no puedo encontrar 00 00 00 e0 00 00 00 9a 00 00 00 56 en todo el archivo binario, incluso si esta instancia se analiza correctamente mediante boost.

Preguntas: ¿Alguien sabe lo que está sucediendo dentro del archivo binario boost? ¿Qué debo hacer para serializar mis instancias en un archivo binario y deserializarlas? Estoy usando la misma computadora, así que creo que este problema no se trata de portabilidad.

Entorno: Windows 8 64 bit, visual studio 2013, boost versión 1_59_0.