使用 DataContractSerializer 和 DataContractResolver 实现 NetDataContractSerializer 的功能

NetDcSasDcSwithDCR 示例演示如何将 DataContractSerializer 与相应的 DataContractResolver 结合使用来提供与 NetDataContractSerializer 相同的功能。 此示例演示如何创建相应的 DataContractResolver 以及如何将其添加到 DataContractSerializer

示例详细信息

NetDataContractSerializerDataContractSerializer 之间存在一个重要区别:NetDataContractSerializer 在序列化的 XML 中包含 CLR 类型信息,而 DataContractSerializer 不包含这种信息。 因此,只有在序列化和反序列化端共享相同的 CLR 类型时,才能使用 NetDataContractSerializer。 但是,建议使用 DataContractSerializer,因为其性能比 NetDataContractSerializer 更佳。 通过将 DataContractSerializer 添加到 DataContractResolver,可以更改在其中序列化的信息。

此示例由两个项目组成。 第一个项目使用 NetDataContractSerializer 来序列化对象。 第二个项目将 DataContractSerializerDataContractResolver 结合使用,以提供与第一个项目相同的功能。

以下代码示例演示如何实现名为 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);
        }
    }
}

使用此示例

  1. 使用 Visual Studio 打开 DCRSample.sln 解决方案文件。

  2. 右击该解决方案文件,然后选择“属性”。

  3. 在“解决方案属性页”对话框中的“通用属性”下面,选择“启动项目”,然后选择“多启动项目:”。

  4. 在“DCSwithDCR”项目旁边,从“操作”下拉列表中选择“启动”。

  5. 在“NetDCS”项目旁边,从“操作”下拉列表中选择“启动”。

  6. 单击“确定”,关闭对话框。

  7. 若要生成解决方案,请按 ++。

  8. 若要运行解决方案,请按 Ctrl+F5。