c# - 当事先不知道派生类型时使用 DataContractSerializer 反序列化派生类型

标签 c# deserialization datacontractserializer

在程序集 A 中:

[DataContract]    
        public class Base
        {
            [DataMember]
            public string SomeText { get; set; }
        }

在程序集 B 中:

internal class Helper
        {
           internal static Base Deserialize(string serializedInstanceOfTypeBase)
    {
                   DataContractSerializer serializer = new DataContractSerializer(typeof (Base));
                    XmlReader reader = XmlReader.Create(new StringReader(serializedInstanceOfTypeBase));
                    return (Base)serializer.ReadObject(reader);
    }
    }

在程序集 C 中:

[DataContract]    
        public class Derived : Base
        {
            [DataMember]
            public string SomeMoreText { get; set; }
        }

如果我序列化 Derived 类型的实例并将其传递给 Helper.Deserialize() 方法,它会失败并出现 SerializationException:

Error in line 1 position 2. Expecting element 'Base' from namespace 'http://schemas.datacontract.org/2004/07'.. Encountered 'Element' with name 'Derived', namespace 'http://schemas.datacontract.org/2004/07'.

我怎样才能摆脱这个问题?

我知道 KnownType 属性,但在编写程序集 A 和 B 时,我完全不知道它的派生类型。所以我不能使用那个解决方案。

我的产品设计比较复杂,我无法在此处完整发布。 Helper.Desrialize() 方法只是获取一个 string 参数。程序集 A 或 B 无法(至少目前)了解 Base 类的派生类型,即使在运行时也是如此。

程序集 B 引用程序集 A。但是 A 和 B 不能引用程序集 C。

我正在使用 C# 4.0。如果您提供的解决方案未使用 DataContractSerializer 也没关系。

最佳答案

看起来你两者都需要:

  • 将一组 KnownType 传递到您的反序列化器(如上所述)
  • 告诉解串器不要检查类型(使用verifyObjectName参数):

    return (Base)serializer.ReadObject(reader, false);
    

查看详情: http://msdn.microsoft.com/en-us/library/ms573850%28v=vs.110%29.aspx

关于c# - 当事先不知道派生类型时使用 DataContractSerializer 反序列化派生类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12859419/

相关文章:

c# - 类转换方法去哪里

c# - 附加信息 : Error converting value [string] to type [enum]

c# - 如何将 JSON (snake_case) 反序列化为动态 (PascalCase)?

c# - Mathos Parser - 使用字母作为运算符

c# - DbContext.Set<T>().SqlQuery 加载相关实体

c# - 反序列化 List<ArrayList> 对象

asp.net - 获取到 localhost 的连接被中断。尝试发送 [DataContract] 标记对象的 JSON 表示时

c# - DataContractSerializer 和反序列化 Web 服务响应类型

c# - 如何使用 DataContractSerializer 反序列化具有未命名类型集合的 JSON

c# - 从本土表单例份验证转移到 AD 的策略是什么?