Il DataContractSerializer è il serializzatore principale del mondo .NET, perché disponibile sul .NET Framework, Silverlight, Windows Phone Runtime e il .NET Metro Profile. La serializzazione è basata su attributi, tra cui DataContrant e DataMember, ma è anche in grado di lavorare con tutte le classi e relative proprietà pubbliche.
Rispetto a motori come il runtime serialization, però, i tipi che può serializzare devono essere noti affinché possa procedere alla conversione di un intero albero. Questa diventa una limitazione soprattutto in quelle situazioni in cui si serializza un tipo object o un dizionario generico. L'origine di questa limitazione proviene dal fatto che il DataContractSerializer è pensato per i servizi dove i tipi devono essere noti a priori ad entrambe le parti. Ci sono casi però, in cui l'uso è prettamente interno e si vuole semplicemente serializzare un grafo di oggetti del proprio dominio.
In questo caso, invece di marcare classi e prevedere tutti i KnownType, è possibile fare affidamento ad un DataContractResolver per prendere come buono qualsiasi tipo .NET. Si procedete quindi alla creazione della classe:
public class GenericTypeResolver : DataContractResolver { private const string ResolverNamespace = "http://www.ASPItalia.com/genericTypeResolver"; public override Type ResolveName(string typeName, string typeNamespace, Type declaredType, DataContractResolver knownTypeResolver) { // In fase di serializzazione non passa mai di qua if (typeNamespace == ResolverNamespace) { // In fase di deserializzazione il namespace mi permette di identificare tutti i tipi // non presenti tra i known type return Type.GetType(typeName); } else { return knownTypeResolver.ResolveName(typeName, typeNamespace, declaredType, null); } } public override bool TryResolveType(Type type, Type declaredType, DataContractResolver knownTypeResolver, out XmlDictionaryString typeName, out XmlDictionaryString typeNamespace) { // Passo dai KnownType, se non lo trovo allora associo un mio namespace if (!knownTypeResolver.TryResolveType(type, declaredType, null, out typeName, out typeNamespace)) { XmlDictionary dictionary = new XmlDictionary(); typeName = dictionary.Add(type.AssemblyQualifiedName); typeNamespace = dictionary.Add(ResolverNamespace); } return true; } }
Il metodo ResolveName viene invocato in fase di serializzazione e deserializzazione e permette, in base al namespace XML, di risolvere il tipo. Facendo uso di un namespace personalizzato si identificano tutti i tipi della soluzione non presenti tra i KnownType. Il metodo TryResolveType, invece, viene invocato in fase di serializzazione per associare il nome e il namespace XML per un certo tipo.
A questo punto non resta che usare il resolver attraverso uno dei costruttori del DataContractSerializer.
DataContractSerializer serializer = new DataContractSerializer(typeof(Object), null, 0x7fffffff, false, true, null, new GenericTypeResolver()); serializer.WriteObject(stream, obj);
E' importante fare attenzione che comunque i tipi devono soddisfare i requisiti di serializzazione.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Eseguire query per recuperare il padre di un record che sfrutta il tipo HierarchyID in Entity Framework
Sviluppare un'interfaccia utente in React con Tailwind CSS e Preline UI
Usare i servizi di Azure OpenAI e ChatGPT in ASP.NET Core con Semantic Kernel
Eseguire query manipolando le liste contenute in un oggetto mappato verso una colonna JSON
Come EF 8 ha ottimizzato le query che usano il metodo Contains
Disabilitare automaticamente un workflow di GitHub
Ottimizzazione dei block template in Angular 17
Path addizionali per gli asset in ASP.NET Core MVC
Gestione degli stili CSS con le regole @layer
Referenziare un @layer più alto in CSS
Usare le navigation property in QuickGrid di Blazor
Sfruttare MQTT in cloud e in edge con Azure Event Grid
I più letti di oggi
- Tutorial Entity Framework 6
- Tutorial Entity Framework
- Tutorial HTML5
- RT @aspitalia Partecipa al nostro evento #RCD4, fai un RT e sarai estratto per 1 copia di #sl3guidacompleta! http://u.aspitalia.com/bw
- Migliorare l'organizzazione delle risorse con Azure Policy
- Configurare più site su unico web role di Windows Azure
- Windows Phone 8 Developer Day - Milano
- ReBuild 2020 Live - Online
- ASPItalia.com Network: si aggiungono LINQItalia.com e SilverlightItalia.com
- Rilasciata la versione 1.0 di ASP.NET MVC