使用 DataContractSerializer 和 DataContractResolver 来实现 NetDataContractSerializer 的功能

NetDcSasDcSwithDCR 示例演示了如何与相应的DataContractSerializer一起使用DataContractResolver,以提供与NetDataContractSerializer相同的功能。 此示例演示如何创建适当的 DataContractResolver 内容以及如何将其添加到 DataContractSerializer

示例详细信息

NetDataContractSerializer 不同于 DataContractSerializer 在一个重要方面: 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. 若要生成解决方案,请按 Ctrl+Shift+B

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