此示例演示如何将 DataContractSerializer 与相应的 DataContractResolver 结合使用来提供与 NetDataContractSerializer 相同的功能。此示例演示如何创建相应的 DataContractResolver 以及如何将其添加到 DataContractSerializer。
示例详细信息
NetDataContractSerializer 与 DataContractSerializer 之间存在一个重要区别:NetDataContractSerializer 在序列化的 XML 中包含 CLR 类型信息,而 DataContractSerializer 不包含这种信息。因此,只有在序列化和反序列化端共享相同的 CLR 类型时,才能使用 NetDataContractSerializer。但是,建议使用 DataContractSerializer,因为其性能比 NetDataContractSerializer 更佳。通过将 DataContractResolver 添加到 DataContractSerializer,可以更改在其中序列化的信息。
此示例由两个项目组成。第一个项目使用 NetDataContractSerializer 来序列化对象。第二个项目将 DataContractSerializer 与 DataContractResolver 结合使用,以提供与第一个项目相同的功能。
以下代码示例演示如何实现名为 MyDataContractResolver
的自定义 DataContractResolver,后者将添加到 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);
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);
}
}
}
使用此示例
使用 Visual Studio 2010 打开 DCRSample.sln 解决方案文件。
右击该解决方案文件,然后选择**“属性”**。
在**“解决方案属性页”[Solution Property Pages]对话框中的“通用属性”下面,选择“启动项目”,然后选择“多启动项目:”**。
在**“DCSwithDCR”项目旁边,从“操作”下拉列表中选择“启动”**。
在**“NetDCS”项目旁边,从“操作”下拉列表中选择“启动”**。
单击**“确定”**关闭对话框。
若要生成解决方案,按 F6。
若要运行解决方案,按 Ctrl+F5。
![]() |
---|
您的计算机上可能已安装这些示例。在继续操作之前,请先检查以下(默认)目录:
<安装驱动器>:\WF_WCF_Samples
如果此目录不存在,请访问针对 .NET Framework 4 的 Windows Communication Foundation (WCF) 和 Windows Workflow Foundation (WF) 示例(可能为英文网页),下载所有 Windows Communication Foundation (WCF) 和 WF 示例。此示例位于以下目录。
<安装驱动器>:\WF_WCF_Samples\WCF\Basic\Contract\Data\NetDcSasDcSwithDCR
|