在大会 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
:
第 1 行位置错误 2. 来自命名空间“http://schemas.datacontract.org/2004/07”的预期元素“Base”.. 遇到名称为“Derived”的“Element”,命名空间“http://schemas.datacontract” .org/2004/07'。
我怎样才能摆脱这个问题?
我知道该KnownType
属性,但是在程序集 A 和 B 中编码时,我绝对不知道它的派生类型。所以我不能使用那个解决方案。
我的产品设计更复杂,我不能在这里完全发布。Helper.Desrialize()
方法只是得到一个string
参数。Base
即使在运行时,程序集 A 或 B 也无法(至少目前)知道类的派生类型。
程序集 B 引用程序集 A。但 A & B 不能引用程序集 C。
我正在使用 C# 4.0。如果您提供的解决方案不使用DataContractSerializer
.