使用 DataContractSerializer 和 DataContractResolver 实现 NetDataContractSerializer 的功能
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+F5。