Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Se o aplicativo serializar e desserializar objetos, talvez seja necessário adicionar entradas ao arquivo de diretivas de runtime (.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 tratamento diferente no arquivo de diretivas de runtime:
Serializadores de terceiros baseados em reflexão. Elas exigem modificações no arquivo de diretivas de runtime e são discutidas na próxima seção.
Serializadores não baseados em reflexão encontrados na biblioteca de classes do .NET Framework. Elas podem exigir modificações no arquivo de diretivas de runtime e são discutidas na seção serializadores da Microsoft.
Serializadores de terceiros
Serializadores de terceiros, incluindo Newtonsoft.JSON, normalmente são baseados em reflexão. Dado um BLOB (objeto binário grande) de dados serializados, os campos nos dados são atribuídos a um tipo concreto pesquisando os campos do tipo de destino por nome. No mínimo, usar essas bibliotecas causa exceções MissingMetadataException para cada objeto Type que você tenta serializar ou desserializar em uma coleção de List<Type>
.
A maneira mais fácil de resolver problemas causados por metadados ausentes 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 <o Elemento Namespace>.
Serializadores da Microsoft
Embora as classes DataContractSerializer, DataContractJsonSerializer e XmlSerializer não dependam de reflexão, elas exigem que o código seja gerado com base no objeto a ser serializado ou desserializado. Os construtores sobrecarregados para cada serializador incluem um parâmetro Type que define o tipo que será serializado ou desserializado. Como você especifica esse tipo em seu código define a ação que você deve executar, conforme discutido nas próximas duas seções.
typeof usado no construtor
Se você chamar um construtor dessas classes de serialização e incluir o operador de do C# 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 nativo do .NET manipulará automaticamente esse código.
typeof usado fora do construtor
Se você chamar um construtor dessas classes de serialização e usar o operador de tipo C# fora da expressão fornecida para o parâmetro Type do construtor, como no código a seguir, o compilador nativo do .NET não poderá resolver o tipo:
Type t = typeof(DataSet);
XmlSerializer ser = new XmlSerializer(t);
Nesse caso, você deve especificar o tipo no arquivo de diretivas de runtime 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 nativo do .NET não poderá resolver esses tipos.
XmlSerializer xSerializer = new XmlSerializer(typeof(Teacher),
new Type[] { typeof(Student),
typeof(Course),
typeof(Location) });
Adicione entradas como a seguinte para cada tipo ao arquivo de diretivas de runtime:
<Type Name="t" Browse="Required Public" />
Para obter informações sobre a sintaxe usada no exemplo, consulte <Type> Element.
Consulte também
- Diretivas de Tempo de Execução (rd.xml) Referência de Arquivo de Configuração
- elementos da diretiva runtime
- <tipo> elemento
- namespace <elemento>