2014-07-26 3 views
5

Attualmente sto salvando una struttura di file in modo che possa essere caricato e successivamente utilizzato mediante l'attuazione di goccia, come segue:Go: è sicuro usare il pacchetto gob per salvare i dati in un file per un uso successivo?

func (t *Object) Load(filename string) error { 

    fi, err := os.Open(filename) 
    if err !=nil { 
     return err 
    } 
    defer fi.Close() 

    fz, err := gzip.NewReader(fi) 
    if err !=nil { 
     return err 
    } 
    defer fz.Close() 

    decoder := gob.NewDecoder(fz) 
    err = decoder.Decode(&t) 
    if err !=nil { 
     return err 
    } 

    return nil 
} 

func (t *Object) Save(filename string) error { 

    fi, err := os.Create(filename) 
    if err !=nil { 
     return err 
    } 
    defer fi.Close() 

    fz := gzip.NewWriter(fi) 
    defer fz.Close() 

    encoder := gob.NewEncoder(fz) 
    err = encoder.Encode(t) 
    if err !=nil { 
     return err 
    } 

    return nil 
} 

La mia preoccupazione è che Go potrebbe essere aggiornato in modo che cambia il modo in cui gobs di dati sono codificati e decodificati. Se ciò accadesse, la versione della mia app compilata con la nuova versione di Go non sarebbe in grado di caricare i file salvati dalla versione precedente. Questo sarebbe un grosso problema, ma non sono sicuro che si tratti di una preoccupazione realistica o meno.

Quindi qualcuno sa se posso considerare sicuro salvare e caricare dati di codifica gob come questo e aspettarsi che funzioni ancora quando Go viene aggiornato?

In caso contrario, quale sarebbe l'alternativa migliore? La mia funzione funzionerebbe ancora se avessi cambiato gob.NewDecoder e gob.NewEncoder in xml.NewDecoder e xml.NewEncoder? (Fa il codificatore XML codifica e decodifica le strutture nello stesso modo come goccia, cioè senza di me dover dire che cosa assomigliano?)

+3

gocce sono state specificamente progettate per questo scopo. La promessa di stabilità Go va anche a coprire il formato di serializzazione usato dai gozzi. – fuz

risposta

5

Il documentation for the type GobEncoder fa menzione:

Nota: Dal momento che sputi possono essere memorizzato in modo permanente, è un buon design per garantire che la codifica utilizzata da un GobEncoder sia stabile mentre il software si evolve.
Ad esempio, potrebbe essere opportuno che GobEncode includa un numero di versione nella codifica.

Ma questo vale per l'encoder personalizzato.

Per quello fornito con go, il compatibility is guarantee at source level: le modifiche Backward-incompatibili non verranno apportate a qualsiasi rilascio Punto 1.

Ciò dovrebbe significare che Gob dovrebbe continuare a funzionare come ora.

Una soluzione diversa e robusta esiste con progetti come "ugorji/go/codec":

High Performance e ricco di funzioni Idiomatic Go Biblioteca fornendo supporto di codifica/decodifica per i diversi formati di serializzazione.

formati di serializzazione supportati sono:

Ma se non avete bisogno di quei formati specifici, goccia dovrebbe essere sufficiente.

Problemi correlati