Sdílet prostřednictvím


Serializace a metadata

Pokud aplikace serializuje a deserializuje objekty, možná budete muset přidat položky do direktiv modulu runtime (.rd.xml), abyste zajistili, že jsou v době běhu k dispozici potřebná metadata. Existují dvě kategorie serializátorů a každý vyžaduje různé zpracování v souboru direktiv modulu runtime:

  • Serializéry třetích stran založené na reflexi Ty vyžadují úpravy souboru direktiv modulu runtime a jsou popsány v další části.

  • Serializátory nezaložené na reflexi nalezené v knihovně tříd .NET Framework. Toto může vyžadovat úpravy souboru direktiv pro runtime a je diskutováno v sekci Serializátory společnosti Microsoft.

Serializátory třetích stran

Serializátory třetích stran, včetně Newtonsoft.JSON, jsou obvykle založené na reflexi. Vzhledem k binárnímu rozsáhlému objektu (BLOB) serializovaných dat jsou pole v datech přiřazena konkrétnímu typu vyhledáním polí cílového typu podle názvu. Minimálně použití těchto knihoven způsobí výjimku MissingMetadataException pro každý Type objekt, který se pokusíte serializovat nebo deserializovat v List<Type> kolekci.

Nejjednodušší způsob, jak vyřešit problémy způsobené chybějícími metadaty pro tyto serializátory, je shromáždit typy, které se použijí při serializaci v rámci jednoho oboru názvů (například App.Models) a použít pro něj direktivu Serialize metadat:

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

Informace o syntaxi použité v příkladu naleznete v tématu <Obor názvů> Element.

Serializátory Microsoftu

DataContractSerializerAčkoli , DataContractJsonSerializera XmlSerializer třídy nespoléhají na reflexi, vyžadují, aby kód byl generován na základě objektu, který má být serializován nebo deserializován. Přetížené konstruktory pro každý serializátor zahrnují Type parametr, který určuje typ, který má být serializován nebo deserializován. Způsob zadání daného typu v kódu definuje akci, kterou musíte provést, jak je popsáno v následujících dvou částech.

typeof použitý v konstruktoru

Pokud voláte konstruktor těchto tříd serializace a použijete operátor C# typeof v metodě volání, nemusíte provádět žádnou další práci. Například v každém z následujících volání na konstruktor třídy serializace se klíčové slovo typeof používá jako součást výrazu předaného konstruktoru.

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

Kompilátor .NET Native automaticky zpracuje tento kód.

typeof použitý mimo konstruktor

Pokud zavoláte konstruktor těchto tříd serializace a použijete C# typeof operátor mimo výraz zadaný do konstruktoru Type parametr, jak je uvedeno v následujícím kódu, kompilátor .NET Native nemůže tento typ přeložit:

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

V tomto případě musíte zadat typ v souboru direktiv modulu runtime přidáním položky takto:

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

Podobně, pokud zavoláte konstruktor, jako je XmlSerializer(Type, Type[]), a předáte pole objektů Type pro serializaci, jak je uvedeno v následujícím kódu, kompilátor .NET Native nemůže tyto typy rozpoznat.

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

Do souboru směrnic běhového prostředí přidejte položky, jako jsou následující pro každý typ:

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

Informace o syntaxi použité v příkladu viz <Typ> Element.

Viz také