Compartir vía


Uso de DataContractSerializer y DataContractResolver para proporcionar la funcionalidad de NetDataContractSerializer

En el ejemplo NetDcSasDcSwithDCR se muestra cómo el uso de DataContractSerializer con un adecuado DataContractResolver proporciona la misma funcionalidad que NetDataContractSerializer. En este ejemplo se muestra cómo crear el adecuado DataContractResolver y cómo agregarlo a .DataContractSerializer

Detalles de ejemplo

NetDataContractSerializer difiere de DataContractSerializer de una manera importante: NetDataContractSerializer incluye información de tipo CLR en el XML serializado, mientras DataContractSerializer no. Por lo tanto, NetDataContractSerializer solo se puede usar si los extremos de serialización y deserialización comparten los mismos tipos CLR. Sin embargo, se recomienda usar DataContractSerializer porque su rendimiento es mejor que NetDataContractSerializer. Puede cambiar la información que se serializa en DataContractSerializer añadiendo una DataContractResolver a ella.

Este ejemplo consta de dos proyectos. El primer proyecto usa NetDataContractSerializer para serializar un objeto. El segundo proyecto usa DataContractSerializer con DataContractResolver para proporcionar la misma funcionalidad que el primer proyecto.

En el siguiente ejemplo de código se muestra la implementación de un DataContractResolver personalizado, llamado MyDataContractResolver, que se ha añadido a DataContractSerializer del proyecto 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 utilizar este ejemplo

  1. Con Visual Studio, abra el archivo de solución DCRSample.sln.

  2. Haga clic con el botón derecho en el archivo de solución y elija Propiedades.

  3. En el cuadro de diálogo Páginas de propiedades de la solución, en Propiedades comunes, Proyecto de inicio, seleccione Varios proyectos de inicio:.

  4. Junto al proyecto DCSwithDCR , seleccione Iniciar en la lista desplegable Acción .

  5. Junto al proyecto NetDCS , seleccione Iniciar en la lista desplegable Acción .

  6. Haga clic en Aceptar para cerrar el cuadro de diálogo.

  7. Para compilar la solución, presione Ctrl+Mayús+B.

  8. Para ejecutar la solución, presione Ctrl+F5.