Usando DataContractSerializer e DataContractResolver para fornecer a funcionalidade de NetDataContractSerializer
O exemplo NetDcSasDcSwithDCR demonstra como o uso de DataContractSerializer com um apropriado DataContractResolver fornece a mesma funcionalidade que NetDataContractSerializer. Este exemplo mostra como criar o apropriado DataContractResolver e como adicioná-lo ao DataContractSerializer.
Detalhes da amostra
NetDataContractSerializerdifere de uma maneira importante: NetDataContractSerializer inclui informações de DataContractSerializer tipo CLR no XML serializado, enquanto DataContractSerializer não. Portanto, NetDataContractSerializer pode ser usado somente se as extremidades de serialização e desserialização compartilharem os mesmos tipos de CLR. No entanto, recomenda-se usar DataContractSerializer porque o seu desempenho é melhor do que NetDataContractSerializer. Você pode alterar as informações que são serializadas adicionando DataContractSerializer um DataContractResolver a ele.
Este exemplo consiste em dois projetos. O primeiro projeto usa NetDataContractSerializer para serializar um objeto. O segundo projeto usa DataContractSerializer com a DataContractResolver para fornecer a mesma funcionalidade que o primeiro projeto.
O exemplo de código a seguir mostra a implementação de um nome MyDataContractResolver
personalizado DataContractResolver que é adicionado ao DataContractSerializer no projeto DCSwithDCR.
class MyDataContractResolver : DataContractResolver
{
private XmlDictionary dictionary = new XmlDictionary();
public MyDataContractResolver()
{
}
// Used at deserialization
// Allows users to map xsi:type name to any Type
public override Type ResolveName(string typeName, string typeNamespace, DataContractResolver knownTypeResolver)
{
Type type = knownTypeResolver.ResolveName(typeName, typeNamespace, null);
type ??= Type.GetType(typeName + ", " + typeNamespace);
return type;
}
// Used at serialization
// Maps any Type to a new xsi:type representation
public override void ResolveType(Type dataContractType, DataContractResolver knownTypeResolver, out XmlDictionaryString typeName, out XmlDictionaryString typeNamespace)
{
knownTypeResolver.ResolveType(dataContractType, null, out typeName, out typeNamespace);
if (typeName == null || typeNamespace == null)
{
XmlDictionary dictionary = new XmlDictionary();
typeName = dictionary.Add(dataContractType.FullName);
typeNamespace = dictionary.Add(dataContractType.Assembly.FullName);
}
}
}
Para usar este exemplo
Usando o Visual Studio, abra o arquivo de solução DCRSample.sln.
Clique com o botão direito do mouse no arquivo de solução e escolha Propriedades.
Na caixa de diálogo Páginas de Propriedades da Solução, em Propriedades Comuns, Projeto de Inicialização, selecione Vários projetos de inicialização:.
Ao lado do projeto DCSwithDCR , selecione Iniciar na lista suspensa Ação .
Ao lado do projeto NetDCS , selecione Iniciar na lista suspensa Ação .
Clique em OK para fechar a caixa de diálogo.
Para criar a solução, pressione Ctrl+Shift+B.
Para executar a solução, pressione Ctrl+F5.