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