Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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# 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
- Dyrektywy uruchomieniowe (rd.xml) Dokumentacja pliku konfiguracyjnego
- Elementy dyrektywy środowiska uruchomieniowego
-
typ elementu - <przestrzeni nazw> Element