5

在大会 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.

4

2 回答 2

4

It looks like you need both:

  • Pass a collection of KnownTypes into your deserializer (as mentioned above)
  • Tell the deserializer not to check the type (use verifyObjectNameparameter):

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

see details here: http://msdn.microsoft.com/en-us/library/ms573850%28v=vs.110%29.aspx

于 2014-01-08T20:55:37.770 回答
3

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

List<Type> knownTypes = ...; // now that you know what to expect
DataContractSerializer serializer = new DataContractSerializer(
    typeof(Base), knownTypes);
于 2012-10-12T12:49:54.637 回答