在程序集 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/