Partager via


Sérialisation et métadonnées

Si votre application sérialise et désérialise des objets, vous devrez peut-être ajouter des entrées à votre fichier de directives runtime (.rd.xml) pour que les métadonnées nécessaires soient présentes au moment de l'exécution. Il existe deux catégories de sérialiseurs et chacune nécessite un traitement différent dans votre fichier de directives runtime :

  • Sérialiseurs tiers basés sur la réflexion. Ils nécessitent des modifications dans votre fichier de directives runtime et sont décrits dans la section suivante.

  • Sérialiseurs non basés sur la réflexion trouvés dans la bibliothèque de classes .NET Framework. Ceux-ci peuvent nécessiter des modifications dans votre fichier de directives runtime et sont décrits dans la section Sérialiseurs Microsoft.

Sérialiseurs tiers

Les sérialiseurs tiers, y compris les Newtonsoft.JSON, sont généralement basés sur la réflexion. Avec un objet BLOB (Binary Large Object) de données sérialisées, les champs de données sont affectés à un type concret en fonction des noms des champs du type cible. L’utilisation de ces bibliothèques entraîne au minimum des exceptions MissingMetadataException pour chaque objet Type que vous essayez de sérialiser ou de désérialiser dans une collection List<Type>.

La façon la plus simple de résoudre les problèmes causés par les métadonnées manquantes pour ces sérialiseurs consiste à collecter les types qui seront utilisés dans la sérialisation dans un espace de noms unique (tel que App.Models) et à lui appliquer une directive de métadonnées Serialize :

<Namespace Name="App.Models" Serialize="Required PublicAndInternal" />

Pour plus d’informations sur la syntaxe utilisée dans l’exemple, consultez <l’élément Namespace>.

Sérialiseurs Microsoft

Bien que les classes DataContractSerializer, DataContractJsonSerializer et XmlSerializer ne reposent pas sur la réflexion, elles nécessitent la génération de code en fonction de l'objet à sérialiser ou à désérialiser. Les constructeurs surchargés pour chaque sérialiseur incluent un paramètre Type qui spécifie le type à sérialiser ou à désérialiser. La façon dont vous spécifiez ce type dans votre code définit l'action à entreprendre, comme indiqué dans les deux sections suivantes.

typeof utilisé dans le constructeur

Si vous appelez un constructeur de ces classes de sérialisation et incluez l’opérateur C# typeof dans l’appel de méthode, vous n’avez pas à effectuer de travail supplémentaire. Par exemple, dans chacun des appels suivants d'un constructeur de classe de sérialisation, le mot clé typeof est utilisé dans le cadre de l'expression passée au constructeur.

XmlSerializer xmlSer = new XmlSerializer(typeof(T));
DataContractSerializer dataSer = new DataContractSerializer(typeof(T));
DataContractJsonSerializer jsonSer = new DataContractJsonSerializer(typeof(T));

Le compilateur .NET Native gère automatiquement ce code.

typeof utilisé à l'extérieur du constructeur

Si vous appelez un constructeur de ces classes de sérialisation et utilisez l’opérateur typeof C# en dehors de l’expression fournie au paramètre du Type constructeur, comme dans le code suivant, le compilateur .NET Native ne peut pas résoudre le type :

Type t = typeof(DataSet);
XmlSerializer ser = new XmlSerializer(t);

Dans ce cas, vous devez spécifier le type dans le fichier de directives runtime en ajoutant une entrée comme suit :

<Type Name="DataSet" Browse="Required Public" />

De même, si vous appelez un constructeur tel que XmlSerializer(Type, Type[]) et fournissez un tableau d’objets supplémentaires Type à sérialiser, comme dans le code suivant, le compilateur .NET Native ne peut pas résoudre ces types.

XmlSerializer xSerializer = new XmlSerializer(typeof(Teacher),
                            new Type[] { typeof(Student),
                                         typeof(Course),
                                         typeof(Location) });

Ajoutez des entrées telles que les suivantes pour chaque type au fichier de directives runtime :

<Type Name="t" Browse="Required Public" />

Pour plus d’informations sur la syntaxe utilisée dans l’exemple, consultez <Type> , élément.

Voir aussi