Consideraría definir una subestructura que los niveles más altos usan para almacenar datos, un poco como un mini sistema de archivos dentro del archivo.
Por ejemplo, aunque su formato de archivo va a almacenar datos específicos de la aplicación, consideraría la definición de registros/secuencias, etc. dentro del archivo de tal manera que el código independiente de la aplicación pueda comprender el diseño del archivo, pero por supuesto no entiende las cargas útiles opacas.
Seamos un poco más concretos. Tenga en cuenta las formas habituales de almacenar datos en la memoria: generalmente se pueden resumir en matrices/listas expansibles contiguas, gráficos basados en punteros/referencias y blobs binarios de datos en formatos particulares.
Por lo tanto, puede ser útil definir el formato de archivo binario en líneas similares. Utilice encabezados de registro que indiquen la longitud y la composición de los siguientes datos, ya sea en forma de matriz (una lista de registros de tipo idéntico), referencias (desplazamientos a otros registros en el archivo) o blobs de datos (por ejemplo, datos de cadena) en una codificación particular, pero que no contiene ninguna referencia).
Si se diseña cuidadosamente, esto puede permitir que el formato de archivo se use no solo para ingresar y sacar datos de una sola vez, sino de manera incremental según sea necesario. Si la subestructura está diseñada correctamente, puede ser independiente de la aplicación y aún así permitir, p. una aplicación de recopilación de basura que se escribirá, que comprende los blobs, matrices y tipos de registro de referencia, y es capaz de rastrear a través del archivo y eliminar registros no utilizados (es decir, registros que ya no se apuntan).
Eso es solo una idea. Otros lugares para buscar ideas son, en general, diseños de sistemas de archivos o estrategias de almacenamiento físico de bases de datos relacionales.
Por supuesto, dependiendo de sus requisitos, esto puede ser excesivo. Es posible que simplemente busque un formato binario para la persistencia de datos en memoria, en cuyo caso, un enfoque a considerar son los registros etiquetados.
En este enfoque, cada parte de los datos tiene como prefijo una etiqueta. La etiqueta indica el tipo de datos que se siguen inmediatamente, y posiblemente su longitud y nombre. Las listas pueden tener el sufijo de una etiqueta de "final de lista" que no tiene carga útil. La etiqueta puede tener un identificador incrustado, por lo que las etiquetas que no se comprenden pueden ser ignoradas por el mecanismo de serialización cuando se leen cosas. A este respecto, se asemeja un poco a XML, excepto el uso de modismos binarios.
En realidad, XML es un buen lugar para buscar la longevidad a largo plazo de un formato de archivo. Mire sus capacidades de espacio de nombres. Si construye cuidadosamente su código de lectura y escritura, debería ser posible escribir aplicaciones que conservan la ubicación y el contenido de los datos etiquetados (recursivamente) que no entienden, posiblemente porque han sido escritos por una versión posterior de la misma aplicación.
PNG es un ejemplo. Otros con una estructura similar son IFF (formato de archivo de intercambio, utilizado principalmente en el Commodore Amiga) y RIFF (por ejemplo, WAV o AVI). – BlaM