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

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.

Mar*_*ell 3

你知道运行时的类型吗?如果是这样,一个简单的方法可能就是:

List<Type> knownTypes = ...; // now that you know what to expect
DataContractSerializer serializer = new DataContractSerializer(
    typeof(Base), knownTypes);
Run Code Online (Sandbox Code Playgroud)