Использование 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);
}
}
}
Использование этого образца
Откройте файл решения DCRSample.sln в среде Visual Studio 2010.
Щелкните правой кнопкой мыши файл решения и выберите Свойства.
В диалоговом окне Страницы свойств решений, ниже разделов Общие свойства и Запускаемый проект, выберите Несколько запускаемых проектов:.
Рядом с проектом DCSwithDCR выберите Пуск в раскрывающемся меню Действие.
Рядом с проектом NetDCS выберите Пуск в раскрывающемся меню Действие.
Нажмите кнопку ОК, чтобы закрыть диалоговое окно.
Чтобы построить решение, нажмите клавишу F6.
Чтобы запустить решение, нажмите клавиши CTRL+F5.
![]() |
---|
Образцы уже могут быть установлены на компьютере. Перед продолжением проверьте следующий каталог (по умолчанию).
<диск_установки>:\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
|