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

  1. Usando o Visual Studio, abra o arquivo de solução DCRSample.sln.

  2. Clique com o botão direito do mouse no arquivo de solução e escolha Propriedades.

  3. 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:.

  4. Ao lado do projeto DCSwithDCR , selecione Iniciar na lista suspensa Ação .

  5. Ao lado do projeto NetDCS , selecione Iniciar na lista suspensa Ação .

  6. Clique em OK para fechar a caixa de diálogo.

  7. Para criar a solução, pressione Ctrl+Shift+B.

  8. Para executar a solução, pressione Ctrl+F5.