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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top