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


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

В образце описывается, как использование 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);
        if (type == 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 2010.

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

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

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

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

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

  7. Чтобы построить решение, нажмите клавишу F6.

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

Ee621289.Important(ru-ru,VS.100).gif Примечание
Образцы уже могут быть установлены на компьютере. Перед продолжением проверьте следующий каталог (по умолчанию).

<диск_установки>:\WF_WCF_Samples

Если этот каталог не существует, перейдите на страницу Образцы Windows Communication Foundation (WCF) и Windows Workflow Foundation (WF) для .NET Framework 4, чтобы загрузить все образцы Windows Communication Foundation (WCF) и WF. Этот образец расположен в следующем каталоге.

<диск_установки>:\WF_WCF_Samples\WCF\Basic\Contract\Data\NetDcSasDcSwithDCR