Использование DataContractSerializer и DataContractResolver для предоставления функциональных возможностей 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.