NetDcSasDcSwithDCR 示例演示了如何与相应的DataContractSerializer一起使用DataContractResolver,以提供与NetDataContractSerializer相同的功能。 此示例演示如何创建适当的 DataContractResolver 内容以及如何将其添加到 DataContractSerializer。
示例详细信息
NetDataContractSerializer 不同于 DataContractSerializer 在一个重要方面: NetDataContractSerializer 在序列化的 XML 中包含 CLR 类型信息,而 DataContractSerializer 不包含。 因此,仅当序列化和反序列化的双方共享相同的 CLR 类型时,NetDataContractSerializer 才能使用。 但是,建议使用 DataContractSerializer ,因为它的性能优于 NetDataContractSerializer。 可以通过添加DataContractSerializer来更改DataContractResolver中序列化的信息。
此示例包含两个项目。 第一个项目用于 NetDataContractSerializer 序列化对象。 第二个项目使用DataContractSerializer和DataContractResolver来提供与第一个项目相同的功能。
以下代码示例演示如何实现名为 DataContractResolver 的自定义 MyDataContractResolver
,后者将添加到 DCSwithDCR 项目中的 DataContractSerializer。
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);
}
}
}
使用此示例
使用 Visual Studio 打开DCRSample.sln解决方案文件。
右键单击解决方案文件,然后选择 “属性”。
在 “解决方案属性页 ”对话框中的 “通用属性”下, 启动项目选择 “多个启动项目”:。
在 DCSwithDCR 项目旁边,从 操作 下拉列表中选择 开始。
在 NetDCS 项目旁边,从 操作 下拉列表中选择 开始。
单击“ 确定” 关闭对话框。
若要生成解决方案,请按 Ctrl+Shift+B。
若要运行解决方案,请按 Ctrl+F5。