Domanda Perché XmlSerializer non deve essere contrassegnato con il tipo [Serializable]?


In C #, se voglio serializzare un'istanza con XmlSerializer, il tipo di oggetto non deve essere contrassegnato con [Serializable] attributo. Tuttavia, per altri approcci di serializzazione, come DataContractSerializer, ha bisogno che la classe sia contrassegnata come [Serializable] o [DataContract].

Esiste uno standard o un modello sui requisiti di serializzazione?


14
2017-12-25 01:59


origine


risposte:


Questo perché XmlSerializer serializza solo campi / proprietà pubblici. Altre forme di serializzazione possono serializzare dati privati, il che costituisce un potenziale rischio per la sicurezza, quindi è necessario "optare" per utilizzare un attributo.


16
2017-12-25 02:03



La sicurezza non è l'unico problema; semplicemente, la serializzazione ha senso solo per alcune classi. Ad esempio, rende poco seriale la serializzazione di una "connessione". Una connessione stringa, certo, ma la connessione stessa? nah. Allo stesso modo, tutto ciò che richiede un puntatore / handle non gestito non verrà serializzato molto bene. Né sono delegati.

Inoltre, XmlSerializer e DataContractSerializer (per impostazione predefinita) sono albero serializzatori, no grafico serializzatori - quindi qualsiasi link ricorsivo (come Parent) causerà la sua rottura.

Contrassegnare la classe con il token preferito del serializzatore è semplicemente un modo per dire "e dovrebbe avere senso".

IIRC, entrambi [XmlSerializer e [DataContractSerializer]  Usato essere molto rigido per chiedere cose come [Serializable], [DataContract] o [IXmlSerializable], ma sono diventati un po 'più liberali ultimamente.


8
2017-12-26 08:34



Al momento ci sono davvero 3 forme di serializzazione nel .Net Framework.

  1. XmlSerialization: per impostazione predefinita funziona su campi e proprietà pubbliche. Può ancora essere controllato tramite XmlElementAttribute, XmlAttributeAttribute, ecc ...
  2. BinarySerialization - Controlled by SerializationAttribute. Profondamente integrato nel CLR
  3. Serializzazione WCF - DataContractAttribute, ecc ...

Sfortunatamente c'è un modello generale standard per la serializzazione. Tutti e 3 i framework hanno requisiti e peculiarità differenti.


2
2017-12-25 15:21