Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Se seu aplicativo serializar e desserializar objetos, talvez seja necessário adicionar entradas ao arquivo de diretivas de tempo de execução (.rd.xml) para garantir que os metadados necessários estejam presentes em tempo de execução. Há duas categorias de serializadores, e cada uma requer manipulação diferente em seu arquivo de diretivas de tempo de execução:
Serializadores de terceiros baseados em reflexão. Elas exigem modificações no arquivo de diretivas de tempo de execução e são discutidas na próxima seção.
Serializadores não baseados em reflexão encontrados na biblioteca de classes do .NET Framework. Pode ser necessário modificar o seu arquivo de diretivas de tempo de execução, e essas modificações são discutidas na seção serializadores da Microsoft.
Serializadores de terceiros
Os serializadores de terceiros, incluindo Newtonsoft.JSON, normalmente são baseados em reflexão. Dado um objeto binário grande (BLOB) de dados serializados, os campos nos dados são atribuídos a um tipo concreto pesquisando os campos do tipo de destino pelo nome. No mínimo, o uso dessas bibliotecas lança exceções MissingMetadataException para cada objeto Type que se tenta serializar ou desserializar numa coleção List<Type>.
A maneira mais fácil de resolver problemas causados pela falta de metadados para esses serializadores é coletar tipos que serão usados na serialização em um único namespace (como App.Models) e aplicar uma Serialize diretiva de metadados a ele:
<Namespace Name="App.Models" Serialize="Required PublicAndInternal" />
Para obter informações sobre a sintaxe usada no exemplo, consulte <Elemento de namespace>.
Serializadores da Microsoft
Embora as classes DataContractSerializer, DataContractJsonSerializer e XmlSerializer não dependam de reflexão, exigem a geração de código com base no objeto a ser serializado ou desserializado. Os construtores sobrecarregados de cada serializador incluem um parâmetro Type que determina o tipo a ser serializado ou desserializado. Como você especifica esse tipo em seu código define a ação que você deve tomar, conforme discutido nas próximas duas seções.
Tipo usado no construtor
Se você chamar um construtor dessas classes de serialização e incluir o C# tipo de operador de na chamada de método, não será necessário fazer nenhum trabalho adicional. Por exemplo, em cada uma das chamadas a seguir para um construtor de classe de serialização, a typeof palavra-chave é usada como parte da expressão passada para o construtor.
XmlSerializer xmlSer = new XmlSerializer(typeof(T));
DataContractSerializer dataSer = new DataContractSerializer(typeof(T));
DataContractJsonSerializer jsonSer = new DataContractJsonSerializer(typeof(T));
O compilador .NET Native manipulará automaticamente esse código.
Tipo de usado fora do construtor
Se chamar um construtor destas classes de serialização e utilizar o operador C# typeof fora da expressão passada para o parâmetro Type do construtor, como no código a seguir, o compilador .NET Native não consegue resolver o tipo:
Type t = typeof(DataSet);
XmlSerializer ser = new XmlSerializer(t);
Nesse caso, você deve especificar o tipo no arquivo de diretivas de tempo de execução adicionando uma entrada como esta:
<Type Name="DataSet" Browse="Required Public" />
Da mesma forma, se você chamar um construtor como XmlSerializer(Type, Type[]) e fornecer uma matriz de objetos adicionais Type para serializar, como no código a seguir, o compilador .NET Native não pode resolver esses tipos.
XmlSerializer xSerializer = new XmlSerializer(typeof(Teacher),
new Type[] { typeof(Student),
typeof(Course),
typeof(Location) });
Adicione entradas como as seguintes para cada tipo ao arquivo de diretivas de tempo de execução:
<Type Name="t" Browse="Required Public" />
Para obter informações sobre a sintaxe usada no exemplo, consulte <Type> Element.