Поделиться через


Использование DataContractSerializer и Data Contract Resolver для обеспечения функциональности NetDataContractSerializer

В примере NetDcSasDcSwithDCR показано, как использование DataContractSerializer с соответствующими DataContractResolver функциями обеспечивает те же функции, что NetDataContractSerializerи . В следующем образце показано, как создать соответствующий DataContractResolver и как добавить его к DataContractSerializer.

Подробные сведения об образце

Существует одно важное отличие NetDataContractSerializer от DataContractSerializer: NetDataContractSerializer включает информацию о типе CLR в сериализованный XML, а DataContractSerializer этого не делает. Таким образом NetDataContractSerializer может использоваться только при использовании одних и тех же типов CLR на концах сериализации и десериализации. Однако рекомендуется использовать DataContractSerializer, поскольку он обладает более высоким уровнем производительности, чем NetDataContractSerializer. Можно изменить данные, сериализуемые в DataContractSerializer при добавлении к нему DataContractResolver.

Этот образец состоит из двух проектов. В первом проекте используется NetDataContractSerializer для сериализации этого объекта. Во втором проекте используется DataContractSerializer с DataContractResolver для обеспечения функциональности, идентичной первому проекту.

В следующем примере кода показана реализация пользовательского DataContractResolver с именем MyDataContractResolver, добавленного к DataContractSerializer в проекте 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);
        }
    }
}

Использование этого образца

  1. Откройте файл решения DCRSample.sln с помощью Visual Studio.

  2. Щелкните правой кнопкой мыши файл решения и выберите "Свойства".

  3. В диалоговом окне "Страницы свойств решения" в разделе "Общие свойства", "Запуск проекта" выберите несколько запускаемых проектов:.

  4. Рядом с проектом DCSwithDCR выберите "Пуск " в раскрывающемся списке "Действие ".

  5. Рядом с проектом NetDCS выберите "Пуск " в раскрывающемся списке "Действие ".

  6. Нажмите кнопку ОК , чтобы закрыть диалоговое окно.

  7. Чтобы создать решение, нажмите клавиши CTRL+SHIFT+B.

  8. Чтобы запустить решение, нажмите клавиши CTRL+F5.