Utilisation de DataContractSerializer et DataContractResolver pour fournir les fonctionnalités de NetDataContractSerializer
L’exemple NetDcSasDcSwithDCR illustre comment l’utilisation de DataContractSerializer avec un DataContractResolver approprié fournit les mêmes fonctionnalités que NetDataContractSerializer. Cet exemple montre comment créer le DataContractResolver approprié et comment l'ajouter au DataContractSerializer.
Détails de l'exemple
NetDataContractSerializer diffère de DataContractSerializer sur un point important : NetDataContractSerializer inclut des informations de type CLR dans le XML sérialisé ; DataContractSerializer ne le fait pas. Par conséquent, NetDataContractSerializer peut être utilisé uniquement si les extrémités de sérialisation et de désérialisation partagent toutes deux les mêmes types CLR. Toutefois, il est recommandé d'utiliser DataContractSerializer, car il offre de meilleures performances que NetDataContractSerializer. Vous pouvez modifier les informations sérialisées dans DataContractSerializer en lui ajoutant un DataContractResolver.
Cet exemple est composé de deux projets. Le premier projet utilise NetDataContractSerializer pour sérialiser un objet. Le second projet utilise DataContractSerializer avec un DataContractResolver pour fournir les mêmes fonctionnalités que le premier projet.
L'exemple de code suivant illustre l'implémentation d'un DataContractResolver personnalisé, nommé MyDataContractResolver
, qui est ajouté au DataContractSerializer du projet DCSwithDCR.
class MyDataContractResolver : DataContractResolver
{
private XmlDictionary dictionary = new XmlDictionary();
public MyDataContractResolver()
{
}
// Used at deserialization
// Allows users to map xsi:type name to any Type
public override Type ResolveName(string typeName, string typeNamespace, DataContractResolver knownTypeResolver)
{
Type type = knownTypeResolver.ResolveName(typeName, typeNamespace, null);
type ??= Type.GetType(typeName + ", " + typeNamespace);
return type;
}
// Used at serialization
// Maps any Type to a new xsi:type representation
public override void ResolveType(Type dataContractType, DataContractResolver knownTypeResolver, out XmlDictionaryString typeName, out XmlDictionaryString typeNamespace)
{
knownTypeResolver.ResolveType(dataContractType, null, out typeName, out typeNamespace);
if (typeName == null || typeNamespace == null)
{
XmlDictionary dictionary = new XmlDictionary();
typeName = dictionary.Add(dataContractType.FullName);
typeNamespace = dictionary.Add(dataContractType.Assembly.FullName);
}
}
}
Pour utiliser cet exemple
À l’aide de Visual Studio, ouvrez le fichier de solution DCRSample.sln.
Cliquez avec le bouton droit sur le fichier solution et choisissez Propriétés.
Dans la boîte de dialogue Pages de propriétés de Solution, sous Propriétés communes, Projet de démarrage, sélectionnez Plusieurs projets de démarrage.
En regard du projet DCSwithDCR, sélectionnez Démarrer dans la liste déroulante Action.
En regard du projet NetDCS, sélectionnez Démarrer dans la liste déroulante Action.
Cliquez sur OK pour fermer la boîte de dialogue.
Pour générer la solution, appuyez sur Ctrl+Maj+B.
Pour exécuter la solution, appuyez sur Ctrl+F5.