Udostępnij przez


Serializacja i metadane

Jeśli aplikacja serializuje i deserializuje obiekty, może być konieczne dodanie wpisów do dyrektyw środowiska uruchomieniowego (.rd.xml), aby upewnić się, że wymagane metadane są obecne w czasie wykonywania. Istnieją dwie kategorie serializatorów, a każda z nich wymaga innej obsługi w pliku dyrektyw środowiska uruchomieniowego:

  • Serializatory zewnętrzne oparte na refleksji. Wymagają one modyfikacji pliku dyrektyw środowiska uruchomieniowego i zostały omówione w następnej sekcji.

  • Serializatory oparte na odbiciu znajdują się w bibliotece klas programu .NET Framework. Mogą one wymagać modyfikacji pliku dyrektyw środowiska uruchomieniowego, które omówiono w sekcji Serializatory firmy Microsoft.

Serializatory innych firm

Serializatory innych firm, w tym Newtonsoft.JSON, zwykle są oparte na odbiciu. Biorąc pod uwagę duży obiekt binarny (BLOB) danych serializowanych, pola w danych są przypisywane do konkretnego typu, wyszukując pola typu docelowego według nazwy. Co najmniej użycie tych bibliotek powoduje wyjątki MissingMetadataException dla każdego obiektu Type, który próbujesz serializować lub deserializować w kolekcji List<Type>.

Najprostszym sposobem rozwiązywania problemów spowodowanych brakującymi metadanymi dla tych serializatorów jest zbieranie typów, które będą używane w serializacji w ramach jednej przestrzeni nazw (takiej jak App.Models) i zastosowanie do niej dyrektywy Serialize metadanych:

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

Aby uzyskać informacje o składni używanej w przykładzie, zobacz <w przestrzeni nazw> elementu.

Serializatory firmy Microsoft

Mimo że klasy DataContractSerializer, DataContractJsonSerializeri XmlSerializer nie opierają się na odbiciu, wymagają generowania kodu na podstawie obiektu do serializacji lub deserializacji. Przeciążone konstruktory dla każdego serializatora zawierają parametr Type, określający typ, który ma być serializowany lub deserializowany. Sposób określania typu w kodzie definiuje akcję, którą należy wykonać, zgodnie z opisem w dwóch następnych sekcjach.

typeof jest używany w konstruktorze

Jeśli wywołasz konstruktor tych klas serializacji i dołączysz operator typeof języka C# w wywołaniu metody, nie trzeba wykonywać żadnych dodatkowych czynności. Na przykład w każdym z następujących wywołań konstruktora klasy serializacji słowo kluczowe typeof jest używane jako część wyrażenia przekazanego do konstruktora.

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

Kompilator .NET Native automatycznie obsłuży ten kod.

typeof używany poza konstruktorem

Jeśli wywołasz konstruktor tych klas serializacji i użyjesz operatora języka C# poza wyrażeniem przypisanym do argumentu Type konstruktora, tak jak w poniższym kodzie, kompilator .NET Native nie będzie w stanie rozpoznać typu:

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

W takim przypadku należy określić typ w pliku dyrektyw środowiska uruchomieniowego, dodając wpis podobny do następującego:

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

Podobnie, jeśli wywołasz konstruktor, taki jak XmlSerializer(Type, Type[]) i udostępnisz tablicę dodatkowych obiektów Type do serializacji, jak w poniższym kodzie, kompilator natywny platformy .NET nie może rozpoznać tych typów.

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

Dodaj wpisy, takie jak następujące dla każdego typu, do pliku dyrektyw środowiska uruchomieniowego:

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

Aby uzyskać informacje o składni używanej w przykładzie, zobacz <Type>, Element.

Zobacz także