Сериализация и метаданные
Если ваше приложение сериализует и десериализует объекты, может потребоваться добавить записи в файл директив среды выполнения (. 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 используется в конструкторе
Если вы вызываете конструктор этих классов сериализации и включаете оператор типа C# в вызов метода, вам не нужно выполнять дополнительную работу. Например, в каждом из следующих вызовов конструктора класса сериализации ключевое слово typeof
используется как часть выражения, переданного в конструктор.
XmlSerializer xmlSer = new XmlSerializer(typeof(T));
DataContractSerializer dataSer = new DataContractSerializer(typeof(T));
DataContractJsonSerializer jsonSer = new DataContractJsonSerializer(typeof(T));
Компилятор .NET Native будет автоматически обрабатывать этот код.
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>".