Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Если приложение сериализует и десериализирует объекты, может потребоваться добавить записи в файл директив среды выполнения (.rd.xml), чтобы убедиться, что необходимые метаданные присутствуют во время выполнения. Существует две категории сериализаторов, и для каждой из них требуется разная обработка в файле директив среды выполнения:
Сторонние сериализаторы на основе рефлексии. Для них требуются изменения в файле директив среды выполнения и рассматриваются в следующем разделе.
Сериализаторы, не основанные на отражении, найденные в библиотеке классов .NET Framework. Для них могут потребоваться изменения в файле директив среды выполнения и рассматриваются в разделе сериализаторов Майкрософт.
Сторонние сериализаторы
Сторонние сериализаторы, включая Newtonsoft.JSON, обычно основаны на отражениях. Учитывая двоичный большой объект (BLOB) сериализованных данных, поля в данных назначаются конкретному типу путем поиска полей целевого типа по имени. Как минимум, использование этих библиотек приводит к исключениям MissingMetadataException для каждого объекта Type, который вы пытаетесь сериализовать или десериализовать в коллекции List<Type>
.
Самый простой способ устранить проблемы, вызванные отсутствием метаданных для этих сериализаторов, заключается в сборе типов, которые будут использоваться в сериализации в одном пространстве имен (например, App.Models
) и применить к нему директиву Serialize
метаданных:
<Namespace Name="App.Models" Serialize="Required PublicAndInternal" />
Сведения о синтаксисе, используемом в примере, см. в разделе <пространство имен> элемент.
Сериализаторы Майкрософт
Хотя классы 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> Element.
См. также
- Директивы среды выполнения (rd.xml) Справочник по файлу конфигурации
- элементы директивы среды выполнения
- < > элемента
- Элемент
пространства имен