Qual è la differenza tra [optionalfield] e [non esperto
-
24-09-2019 - |
Domanda
Mi sono imbattuto in questa domanda su Transcender:
Cosa dovresti applicare a un campo se il suo valore non è richiesto durante la deserializzazione?
ME = [non una nonrialized], risposta = [optionalfield
La mia reazione intestinale è stata non serializzata ma il transcender dice che mi sbaglio. Ho una buona idea di cosa guardare per quanto riguarda l'attributo [noniseralizzato], ma mi piacerebbe davvero che questo fosse stato chiarito.
Per quanto posso dire che il primo ha una relazione con i conflitti di versioni tra versioni più recenti e vecchie della stessa assemblea. Quest'ultimo è più interessato a non serializzare un campo Fullstop. C'è qualcos'altro che potrebbe distinguere questi due? MSDN non dice molto su questo in quanto entrambi sono usati su BinaryFformaters e SoapFormatter con XMLFormatter usando XMLignoreEattribute.
La mia seconda domanda è che puoi mescolare e abbinare uno dei due attributi? Devo ancora usarli.
Basta lanciare questo là fuori, ma la mia risposta ha qualcosa a che fare con il modo in cui [onDeserialized] e l'interfaccia di IdeerilitionCallback è implementata?
AGGIORNARE:
So che l'attributo di campo opzionale non serializza il valore detenuto da un membro dei dati ma non siniserializzato non asserirà nemmeno il membro dei dati o il suo valore.
Soluzione
Questi due attributi sono usati per i lati opposti dell'equazione di serializzazione.
Quando usi [NonSerialized]
, stai dicendo "Questo campo non dovrebbe essere affatto serializzato", quindi è più un attributo di "tempo di salvataggio". Fondamentalmente, stai dicendo che il campo non ha importanza per lo stato serializzato dell'oggetto.
Quando usi [OptionalField]
, D'altra parte, stai ancora per serializzare il campo. Tuttavia, se il campo è mancante a Tempo per leggere (Quando il flusso viene deserializzato in un oggetto), non verrà sollevata alcuna eccezione. Questo attributo ha davvero lo scopo di consentire di aggiungere un nuovo campo a un tipo serializzabile esistente, senza rompere la compatibilità. Le versioni precedenti dell'oggetto (che mancano quel campo) saranno deserializzate normalmente.
Altri suggerimenti
Sto solo giocando fuori dalla lingua inglese, non richiesto e opzionale significa la stessa cosa in questo caso.
Per la tua prima domanda, l'hai praticamente inchiodata sulla testa. [OptionalField]
Fondamentalmente consente alle serializzazioni più vecchie di essere compatibili con le definizioni più recenti. [NonSerialized]
significa che non lo troverai nei dati serializzati.
Date le differenze, non riesco a immaginare perché avresti messo entrambi su un singolo campo, ma immagino che il compilatore si lamentasse.