Сериализация и метаданные

Если ваше приложение сериализует и десериализует объекты, может потребоваться добавить записи в файл директив среды выполнения (. rd.xml) файл, чтобы гарантировать наличие необходимых метаданных во время выполнения. Существует две категории сериализаторов, и каждый требует различной обработки в файла директив среды выполнения:

  • Сериализиторы сторонних поставщиков на основе отражения. Они требуют изменений в файле директив среды выполнения и рассматриваются в следующем разделе.

  • Сериализаторы, не основанные на отражении, находятся в библиотеке классов платформа .NET Framework. Они могут потребовать внесения изменений в файл директив среды выполнения и обсуждаются в разделе Сериализаторы Майкрософт.

Сериализаторы сторонних поставщиков

Сторонние сериализаторы, включая Newtonsoft.JSON, обычно основаны на отражении. Учитывая большой двоичный объект (BLOB) из сериализованных данных, поля данных назначаются конкретному типу путем поиска полей типа целевого объекта по имени. Как минимум, использование этих библиотек приводит к исключениям MissingMetadataException для каждого объекта Type при попытке сериализации или десериализации в коллекции List<Type>.

Самый простой способ решения проблем, вызванных отсутствующими метаданными для этих сериализаторов, состоит в сборе типов, которые будут использоваться при сериализации в одном пространстве имен (например, App.Models) и применить к нему директиву метаданных Serialize:

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

Сведения о синтаксисе, используемом в примере, см. в разделе <Элемент пространства имен>.

Сериализаторы Microsoft

Несмотря на то, что классы DataContractSerializer, DataContractJsonSerializer и XmlSerializer не рассчитывают на отражение, они требуют создания кода на основе объекта для сериализации или десериализации. Перегруженные конструкторы для каждого сериализатора содержа параметр Type, который задает тип для сериализации или десериализации. Способ указания этого типа в коде определяет действие, которое необходимо выполнить, как описано в следующих двух разделах.

TypeOf используется в конструкторе

Если вы вызываете конструктор этих классов сериализации и включаете оператор typeof C# в вызов метода, вам не нужно выполнять никаких дополнительных действий. Например, в каждом из следующих вызовов конструктора класса сериализации ключевое слово typeofиспользуется как часть выражения, переданного в конструктор.

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

Компилятор .NET Native будет автоматически обрабатывать этот код.

TypeOf, использованный за пределами конструктора

Если вызвать конструктор этих классов сериализации и использовать оператор typeof C# вне выражения, предоставленного параметру конструктораType, как показано в следующем коде, компилятор .NET Native не сможет разрешить тип :

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

В этом случае необходимо указать тип в файле директив среды выполнения, добавив следующую запись:

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

Аналогичным образом, если вызвать конструктор, например XmlSerializer(Type, Type[]) , и предоставить массив дополнительных Type объектов для сериализации, как показано в следующем коде, компилятор .NET Native не сможет разрешить эти типы.

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

Добавьте следующие записи для каждого типа в файл директив среды выполнения:

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

Сведения о синтаксисе, используемом в примере, см. в разделе <Элемент Type>.

См. также раздел