2013-02-19 10 views
5

Per dare un po 'di sfondo.Buona pratica di codifica per il salvataggio dei dati nei file in .net

Ho creato un'applicazione che consente agli utenti di salvare le impostazioni e quindi richiamare le impostazioni in un secondo momento. Per fare ciò ho creato alcuni oggetti serializzabili. Ho ottenuto questo per funzionare utilizzando il BinaryFormatter senza troppi problemi.

L'inizio dei problemi è quando aggiorno il software e aggiungo nuove impostazioni. Ora i miei oggetti serializzabili non corrispondono e quindi devo aggiornare i file. L'ho fatto con successo per alcune versioni. Ma per farlo cerco di deserializzare il file e se lancia un'eccezione, provo con la prossima versione. . . e poi il prossimo. . . e poi il prossimo. . . finché non trovo quello giusto. Quindi devo scrivere le funzioni di conversione per ciascuna delle vecchie versioni per convertirlo nella versione più recente. Ho creato anche un file di "revisione", quindi posso controllare in anticipo la versione che hanno e quindi aggiornarlo, ma devo ancora tenere un sacco di diverse "versioni" in vita e scrivere le funzioni di conversione per tutte loro . . . che sembra intrinsecamente disordinato per me e incline a gonfiare più tardi lungo la linea se continuo a percorrere questa strada.

Ci deve essere un modo migliore per farlo, non so come.

Grazie

+0

C'è una funzionalità incorporata nel .net framework, che inizia con la versione 2, che fa esattamente ciò che si desidera senza dover scrivere il proprio codice. Si prega di vedere la mia risposta qui sotto. – Andy

risposta

3

È necessario scrivere un serialization binder per risolvere assemblee.

Per le impostazioni, utilizzo un Dictionary<string, byte[]> da salvare nel file. Serializzo il dizionario e tutto va bene. Quando aggiungo nuove impostazioni, fornisco un'impostazione predefinita se non si trova nel file delle impostazioni.

Inoltre, se si aggiungono campi a un oggetto serializzato, è possibile decorare con [Opzionale].

0

in realtà ciò può essere fatto aggiungendo un attributo [DefaultValue()] alle nuove proprietà sugli oggetti delle impostazioni, almeno per la serializzazione XML. Non ho provato questo usando la serializzazione binaria. Per xml, ciò significa che sono "opzionali" e la serializzazione non si interromperà quando si carica la vecchia versione dei file. È possibile trovare questo attributo nello spazio dei nomi System.ComponentModel in questo modo;

class MySettings 
{ 
    public int MaxNumLogins { get; set; } 

    // specify the value to default to if it's not present in the serialized file... 
    [DefaultValue(0)] 
    public int CacheTimeoutMinutes { get; set; } 
} 
+0

I serializzati binari sono molto più difficili di quelli serializzati XML, non penso che funzionerà. –

0

Oltre ai nomi dei campi come altri hanno suggerito questo genere di cose solo grida per i numeri di versione.

2

Questo è esattamente ciò che la classe Impostazioni è per. Definisci i valori predefiniti nel tuo app.config, quindi un utente può cambiarli e quando salvi, le loro modifiche verranno salvate in un percorso nel loro profilo utente. Quando li leggi, otterrai solo le impostazioni modificate.

Questo collegamento è per VS 2005, ma funziona esattamente lo stesso in VS 2012: http://msdn.microsoft.com/en-us/library/aa730869(v=vs.80).aspx

trovato il link per VS2012: http://msdn.microsoft.com/EN-US/library/k4s6c3a0(v=VS.110,d=hv.2).aspx

+0

Buono a sapersi, grazie. Questo non è esattamente ciò di cui ho bisogno, ma probabilmente lo userò in futuro. – EatATaco

+0

@EatATaco Nulla nella tua domanda mi fa pensare che stai facendo qualcosa che la funzionalità integrata non offre, quindi mi sembra che tu stia reinventando la ruota. Forse puoi aggiornare la tua domanda in modo che possiamo sapere perché le impostazioni integrate non sono appropriate per questo. – Andy

0

Si potrebbe avere uno sguardo a protobuf-Net http://code.google.com/p/protobuf-net/wiki/GettingStarted se siete fare binario perché tutte queste cose sono coperte per quanto riguarda il controllo delle versioni ecc. È anche molto compatto. Inoltre, è attivamente sviluppato e se potenzialmente hai requisiti multipiattaforma se usi un file .proto puoi anche farlo.

Se si desidera che le persone siano in grado di modificare le impostazioni (all'esterno del programma), è possibile utilizzare i metodi di serializzazione XML *.

1

Il formato XML è per questi casi. Troverai le vecchie impostazioni necessarie nella primissima versione del file delle impostazioni. E anche la vecchia versione può gestire le impostazioni XML create dalla versione più recente. Non funziona "automaticamente", cioè con un metodo come Serialize/Deserialize, ma la scrittura delle funzioni di conversione non è più facile o più veloce.

Problemi correlati