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 à vos directives runtime (.rd.xml) pour vous assurer que les métadonnées nécessaires sont présentes au moment de l’exécution. Il existe deux catégories de sérialiseurs, chacune nécessitant une gestion différente dans votre fichier de directives runtime :

  • Sérialiseurs tiers basés sur la réflexion. Ces modifications nécessitent des modifications apportées à votre fichier de directives d’exécution et sont décrites dans la section suivante.

  • Sérialiseurs non basés sur la réflexion trouvés dans la bibliothèque de classes .NET Framework. Ces modifications peuvent nécessiter des modifications dans votre fichier de directives d’exécution et sont décrites dans la section sérialiseurs Microsoft .

Sérialiseurs tiers

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

Le moyen le plus simple de résoudre les problèmes causés par des métadonnées manquantes pour ces sérialiseurs consiste à collecter des types qui seront utilisés dans la sérialisation sous un espace de noms unique (par exemple App.Models) et à appliquer une Serialize directive de métadonnées à celle-ci :

<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 s'appuient 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 de données à sérialiser ou à désérialiser. La façon dont vous spécifiez ce type dans votre code définit l’action que vous devez 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 à un constructeur de classe de sérialisation, le typeof mot clé 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é en dehors 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