Garantire la mancanza di dati nella serializzazione

0

Sto convertendo un codice che in precedenza scriveva le strutture direttamente nella memoria, per usare la serializzazione. Questo perché è piuttosto fastidioso avere pile di codice per decomprimere le strutture che sono state disposte in modo diverso nelle vecchie versioni del codice che sono state aggiornate.

In questa fase sto scrivendo a mano il codice di serializzazione, non sto cercando la serializzazione automatica.

Pseudocodice:

 struct S
 {
      int x;
      char ch; 
      short d;  
      struct { char a,b,c; } t;
 };

 void serialize_S(struct S const *s);   // ignore details about serialization buffer for now

Supponiamo di aver scritto serialize_S correttamente. Il problema che mi preoccupa è che qualcuno possa aggiungere un campo a struct S senza aggiornare la funzione di serializzazione (e senza aggiornare alcuna suite di test). Potremmo pensare che il nuovo campo venga serializzato quando non lo è.

La mia domanda è: c'è qualcosa che posso fare per generare un errore di compilazione se un campo esiste nella struttura ma non è menzionato nella funzione di serializzazione?

Se necessario, la soluzione potrebbe richiedere tag aggiuntivi o qualcosa nella definizione di struct: sono pronto a credere che se le persone stanno modificando la definizione della struct e vedono qualcosa come una macro SERIALIZE_ME alla fine di ogni campo, Mi renderò conto di aggiungerlo anche agli altri campi (o almeno, vedrei questa cosa guardando le differenze sulla revisione del codice).

    
posta M.M 01.06.2017 - 07:08
fonte

1 risposta

5

I am hand-writing the serialization code, I'm not looking for automated serialization.

Ma questo è esattamente il punto in cui puoi risolvere il tuo problema: crea un generatore di codice per il codice di serializzazione, che prende una meta descrizione da un file (ad esempio un file XML) e genera le strutture e la serializzazione codice da questa singola fonte. Dove necessario, lascia che il generatore di codice fornisca alcuni punti di estensione per il codice scritto manualmente.

Un altro approccio potrebbe essere un controllo delle dimensioni in un test unitario generico, ma questo dipende in larga misura dai dettagli della serializzazione. Se sizeof(S) deve corrispondere alla lunghezza di una stringa binaria prodotta all'interno della funzione serialize_S , calcola questa creazione di una stringa binaria in una funzione separata e crea un test che confronta i due valori di dimensione. Quando S viene esteso in seguito, ma non il codice di serializzazione, questo test avrà esito negativo.

    
risposta data 01.06.2017 - 07:42
fonte

Leggi altre domande sui tag