由于您没有显示任何代码,我们只能猜测是什么原因造成的。
如果您使用具有通用项目类型的可靠队列(例如SomeUnit
.
// Using reliable collection with a base item type
IReliableQueue<BaseClass> myQueue = ...;
// Store derived item in the queue
SomeUnit myData = ...; // SomeUnit inherit from BaseClass
await myQueue.EnqueueAsync(txn, myData); // OK to store but won't deserialize!
该队列的反序列化器将知道如何解析BaseClass
,但它不会隐式知道您的派生类SomeUnit
。
您可以通过KnownTypeAttribute
在基类上应用 a 来解决此问题,从而显式声明反序列化程序应注意的派生类。
[DataContract]
[KnownType(typeof(SomeUnit))]
public class BaseClass
{
...
}
[DataContract]
public class SomeUnit : BaseClass
{
...
}
无法在接口类型上应用 [KnownType]。但是,有一些选项可以支持这一点:
选项1
使用包装合同来声明已知类型。
[DataContract]
[KnownType(typeof(SomeUnit))]
public class Wrapper
{
[DataMember]
public IUnit Value { get; set; }
}
[DataContract]
public class SomeUnit : IUnit
{
...
}
选项 #2
为DataContractSerializer 构造函数指定已知类型。
但是,这将要求您告诉服务结构使用您的自定义序列化程序。
选项#3
如此处所述,在配置文件 (app.config) 中指定已知类型。