Lea*_*ner 5 c# datacontractserializer deserialization
在大会A中:
[DataContract]
public class Base
{
[DataMember]
public string SomeText { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在大会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);
}
}
Run Code Online (Sandbox Code Playgroud)
在程序集C中:
[DataContract]
public class Derived : Base
{
[DataMember]
public string SomeMoreText { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
如果我序列化一个类型的实例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.
你知道运行时的类型吗?如果是这样,一个简单的方法可能就是:
List<Type> knownTypes = ...; // now that you know what to expect
DataContractSerializer serializer = new DataContractSerializer(
typeof(Base), knownTypes);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3134 次 |
| 最近记录: |