2012-03-26 13 views
7

Ho una base di codice esistente che persiste un paio di classi semplici su disco tramite NetDataContractSerializer, ma le classi non sono purtroppo adornate con [DataContract], ma con [Serializable]. Funziona bene, ma ora voglio aggiungere alcune nuove proprietà alle classi persistenti, pur essendo ancora in grado di leggere i file generati dalla vecchia versione.Proprietà facoltative durante la deserializzazione di una miscela di DataContract/serializzabile

Diciamo che questa è la classe:

[Serializable] 
public class Persisted 
{ 
    public int OldProperty {get;set;} 
    public int NewProperty {get;set;} 
} 

Ora, quando deserializzare i vecchi file, ottengo un'eccezione perché non contengono NewProperty. Questo ha senso. Quindi volevo che lo NewProperty fosse ignorato, ma mentre c'è un attributo [OptionalField] in modo che il serializzatore ignori il campo mancante, non può essere applicato alle proprietà - solo campi.

così ho pensato che userò [DataContract] e [DataMember], che ha anche una proprietà IsRequired, ma questo cambia il layout del file serializzato, e non è in grado di leggere i file di dati vecchi. Inoltre, non è possibile combinare [Serializable] e [DataMember] - se il serializzatore vede l'attributo [Serializable], ignora le direttive [DataMember].

Quindi, escludendo l'opzione di eseguire una conversione una tantum dei vecchi file (possibile, ma non la mia prima scelta), c'è un modo per ottenere che NetDataContractSerializer ignori un campo in un oggetto serializzato XML esistente?

risposta

4

Il problema è che quando si utilizza l'attributo Serializable, ciò che viene serializzato sono campi , non proprietà. Poiché utilizzi le proprietà automatiche, i campi sono nascosti e non puoi aggiungere attributi.

La soluzione è semplice: non utilizzare le proprietà automatiche.

Problemi correlati