Nel nostro progetto abbiamo questo formato di dati che usiamo per elaborare e registrare dati su. A partire da ora la nostra applicazione è cambiata in modo tale che molti dei parametri dei formati dati sono diventati obsoleti. Attualmente riceviamo questi "pacchetti" di dati su Internet (UDP o TCP) e da file binari salvati.
Vogliamo creare un nuovo formato più efficiente sotto il profilo dello spazio, rimuovendo ciò di cui non abbiamo bisogno. Ogni formato è diviso in un'intestazione e in un payload, in cui sono presenti nell'intestazione cose come le informazioni sul timestamp e alcune descrizioni del carico utile.
Per garantire che possiamo supportare più versioni di un formato, abbiamo deciso che era logico inserire una sorta di ID di versione del formato nella parte superiore del formato per ogni formato che realizziamo. Purtroppo il formato precedente (creato da persone che non sono più nel nostro team) non segue la convenzione e ad un certo punto è stata presa la decisione di inserire l'ID della versione del formato nel medio del formato, in mezzo a dove erano tutti i dati inutili spazzatura.
leggere questo vecchio formato è un problema perché al momento disponiamo attualmente di gigabyte di dati di quel formato che utilizziamo come dati di test per la nostra applicazione, elementi raccolti nel campo.
In che modo entrambi garantiamo che i formati che non seguono il formato format version ID, everything else
possono ancora essere letti dalla nostra applicazione e dalle versioni future del formato che creiamo?
Abbiamo preso in considerazione quanto segue:
-
Passa al formato successivo, ignorando i vecchi dati. Non responsabile, proibitivamente costoso.
-
Avere all'utente un po 'come specificare quale formato è (formati che possono essere trovati dall'intestazione immediatamente rispetto ai vecchi tipi di formato). Fastidioso, e duro con le persone che non sono sviluppatori di questo progetto, ma contribuiscono anche (di cui ce ne sono molti).
-
Le nuove versioni di formato seguono la versione precedente fino alla parte dell'ID versione. attenua molti dei vantaggi del passaggio alla nuova versione, richiede un'attenta pianificazione di dove posizionare i byte di intestazione per garantire che l'ID della versione sia ancora nella stessa posizione (più difficile per gli sviluppatori).
-
Conversione di vecchi formati nelle versioni dell'intestazione dell'ID della versione, richiede nuovi strumenti e il mantenimento del convertitore di versione, richiede anche l'aggiornamento di tutti i file di altri, questi file registrati sono con persone che non sono sviluppatori e non stanno utilizzando anche il controllo della versione, quindi sarà difficile accertarsi che i dati già registrati possano essere utilizzati correttamente per tutti.
Ecco un esempio di come appare l'intestazione corrente:
* = contrassegnato per la rimozione
size: 8 bytes
payload metadata: 8 bytes
payload metadata: 8 bytes
* non-standard timeformat: 8 bytes
* non-standard timeformat: 8 bytes
* legacy undocumented data: 8 bytes
version number: 8 bytes
* source metadata: 8 bytes // may not want this all the time
sequence number: 8 bytes
short range time: 8 bytes
payload metadata: 8 bytes
* size data?: 8 bytes
* spare data: 8 bytes
payload: N bytes