Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Annotazioni
Questo contenuto viene ristampato con il permesso di Pearson Education, Inc. da Framework Design Guidelines: Conventions, Idioms e Pattern per Librerie .NET Riutilizzabili, 2a Edizione. Tale edizione è stata pubblicata nel 2008 e il libro è stato completamente rivisto nella terza edizione. Alcune informazioni in questa pagina potrebbero non essere aggiornate.
La serializzazione è il processo di conversione di un oggetto in un formato che può essere facilmente persistente o trasportato. Ad esempio, è possibile serializzare un oggetto, trasferirlo su Internet tramite HTTP e deserializzarlo nel computer di destinazione.
.NET Framework offre tre tecnologie di serializzazione principali ottimizzate per diversi scenari di serializzazione. Nella tabella seguente sono elencate queste tecnologie e i principali tipi di framework correlati a queste tecnologie.
| Nome tecnologia | Tipi principali | Scenari |
|---|---|---|
| Serializzazione del contratto di dati | DataContractAttribute DataMemberAttribute DataContractSerializer NetDataContractSerializer DataContractJsonSerializer ISerializable |
Persistenza generale Servizi Web JSON (JavaScript Object Notation) |
| Serializzazione XML | XmlSerializer | Formato XML con controllo completo sulla forma del codice XML |
| Serializzazione di runtime (binaria e SOAP) | SerializableAttribute ISerializable BinaryFormatter SoapFormatter |
Comunicazione remota .NET |
✔️ Considerare la serializzazione quando si progettano nuovi tipi.
Scelta della tecnologia di serializzazione corretta da supportare
Considerare il supporto della serializzazione di Data Contract se le istanze del tipo potrebbero dover essere persistenti o usate nei servizi Web.
✔️ È consigliabile supportare la serializzazione XML anziché o oltre alla serializzazione del contratto dati se è necessario un maggiore controllo sul formato XML generato quando il tipo viene serializzato.
Questo può essere necessario in alcuni scenari di interoperabilità in cui è necessario usare un costrutto XML non supportato dalla serializzazione del contratto dati, ad esempio per produrre attributi XML.
✔️ Prendere in considerazione il supporto della serializzazione di runtime se le istanze del tipo devono attraversare i limiti di comunicazione remota .NET.
❌ EVITARE di supportare la serializzazione di runtime o la serializzazione XML solo per motivi di persistenza generali. Preferisci invece la serializzazione con Data Contract.
Supporto alla serializzazione del contratto di dati
I tipi possono supportare la serializzazione del contratto dati applicando DataContractAttribute al tipo e DataMemberAttribute ai membri (campi e proprietà) del tipo.
✔️ VALUTARE la possibilità di rendere i membri dati del tipo come pubblici se il tipo può essere usato in attendibilità parziale.
Con fiducia completa, i serializzatori del contratto dati possono serializzare e deserializzare tipi e membri non pubblici, ma solo i membri pubblici possono essere serializzati e deserializzati in fiducia parziale.
✔️ IMPLEMENTA un getter e un setter su tutte le proprietà che hanno DataMemberAttribute. I serializzatori del contratto dati richiedono che sia il getter che il setter per il tipo siano considerati serializzabili. In .NET Framework 3.5 SP1 alcune proprietà della raccolta possono essere di sola lettura. Se il tipo non verrà usato in attendibilità parziale, una o entrambe le funzioni di accesso della proprietà possono essere non pubbliche.
✔️ CONSIDERARE l'utilizzo dei callback di serializzazione per inizializzare le istanze deserializzate.
I costruttori non vengono chiamati quando gli oggetti vengono deserializzati. Sono presenti eccezioni alla regola. I costruttori di raccolte contrassegnati con CollectionDataContractAttribute vengono chiamati durante la deserializzazione. Pertanto, qualsiasi logica eseguita durante la costruzione normale deve essere implementata come uno dei callback di serializzazione.
OnDeserializedAttribute è l'attributo di callback più comunemente usato. Gli altri attributi della famiglia sono OnDeserializingAttribute, OnSerializingAttributee OnSerializedAttribute. Possono essere usati per contrassegnare i callback che vengono eseguiti prima della deserializzazione, prima della serializzazione e infine, dopo la serializzazione, rispettivamente.
✔️ PRENDERE IN CONSIDERAZIONE l'uso di KnownTypeAttribute per indicare tipi concreti che devono essere usati durante la deserializzazione di un oggetto grafico complesso.
✔️ È consigliabile valutare la compatibilità con le versioni precedenti e successive durante la creazione o la modifica di tipi serializzabili.
Ricorda che i flussi serializzati delle versioni future del tuo tipo possono essere deserializzati nella versione corrente dello stesso tipo, e viceversa.
Assicurarsi di comprendere che i membri di dati, anche privati e interni, non possono modificare i nomi, i tipi o persino il loro ordine nelle versioni future del tipo, tranne quando viene prestata particolare attenzione a mantenere il contratto utilizzando parametri espliciti negli attributi del contratto di dati.
Testare la compatibilità della serializzazione quando si apportano modifiche ai tipi serializzabili. Provare a deserializzare la nuova versione in una versione precedente e viceversa.
✔️ CONSIDERARE l'implementazione di IExtensibleDataObject per consentire la conversione bidirezionale tra versioni diverse del tipo.
L'interfaccia consente al serializzatore di assicurarsi che non vengano persi dati durante il round trip. La IExtensibleDataObject.ExtensionData proprietà viene utilizzata per archiviare tutti i dati della versione futura del tipo sconosciuto alla versione corrente e quindi non può archiviarlo nei relativi membri dati. Quando la versione corrente viene successivamente serializzata e deserializzata in una versione futura, i dati aggiuntivi saranno disponibili nel flusso serializzato.
Supporto della serializzazione XML
La serializzazione del contratto dati è la tecnologia di serializzazione principale (predefinita) in .NET Framework, ma esistono scenari di serializzazione che la serializzazione del contratto dati non supporta. Ad esempio, non fornisce il controllo completo sulla forma di XML prodotta o utilizzata dal serializzatore. Se è necessario un controllo di questo tipo, è necessario usare la serializzazione XML ed è necessario progettare i tipi per supportare questa tecnologia di serializzazione.
❌ EVITARE di progettare i tipi specificamente per la serializzazione XML, a meno che non si abbia un motivo molto forte per controllare la forma del codice XML prodotto. Questa tecnologia di serializzazione è stata sostituita dalla serializzazione del contratto dati descritta nella sezione precedente.
✔️ È consigliabile implementare l'interfaccia IXmlSerializable se si desidera un maggiore controllo sulla forma del codice XML serializzato rispetto a quello offerto applicando gli attributi di serializzazione XML. Due metodi dell'interfaccia, ReadXml e WriteXml, consentono di controllare completamente il flusso XML serializzato. È anche possibile controllare lo schema XML generato per il tipo applicando .XmlSchemaProviderAttribute
Supporto della serializzazione del runtime
La serializzazione di runtime è una tecnologia usata dalla comunicazione remota .NET. Se si ritiene che i tipi vengano trasportati tramite la comunicazione remota .NET, è necessario assicurarsi che supportino la serializzazione di runtime.
Il supporto di base per la serializzazione di runtime può essere fornito applicando SerializableAttribute, e gli scenari più avanzati prevedono l'implementazione di un semplice modello serializzabile di runtime (implementando ISerializable e fornendo il costruttore di serializzazione).
✔️ Considerare di supportare la Runtime Serialization se i tipi verranno utilizzati con .NET Remoting. Ad esempio, lo System.AddIn spazio dei nomi usa la comunicazione remota .NET e quindi tutti i tipi scambiati tra System.AddIn i componenti aggiuntivi devono supportare la serializzazione di runtime.
✔️ CONSIDERARE l'implementazione del pattern di serializzazione a runtime se desideri il controllo completo sul processo di serializzazione. Ad esempio, se si desidera trasformare i dati durante la serializzazione o la deserializzazione.
Il modello è molto semplice. È sufficiente implementare l'interfaccia ISerializable e fornire un costruttore speciale usato quando l'oggetto viene deserializzato.
✔️ ASSICURATI DI rendere il costruttore di serializzazione protetto e fornire due parametri tipizzati e denominati esattamente come illustrato nell'esempio seguente.
[Serializable]
public class Person : ISerializable
{
protected Person(SerializationInfo info, StreamingContext context)
{
// ...
}
}
✔️ DEVI implementare i ISerializable membri in modo esplicito.
✔️ APPLICARE una richiesta di collegamento all'implementazione ISerializable.GetObjectData. In questo modo si garantisce che solo il core completamente attendibile e il serializzatore di runtime abbiano accesso al membro.
© Porzioni 2005, 2009 Microsoft Corporation. Tutti i diritti riservati.
Ristampato dall'autorizzazione di Pearson Education, Inc. da Framework Design Guidelines: Conventions, Idioms e Patterns for Reusable .NET Libraries, 2nd Edition di Krzysztof Cwalina e Brad Abrams, pubblicato il 22 ottobre 2008 da Addison-Wesley Professional come parte della Serie di sviluppo di Microsoft Windows.