可靠的收集(队列)值存储一些复杂类型SomeUnit
。
我将其标记为[DataContract]
,并将其标记为[DataMember]
,并在其顶部添加了[KnownType(typeof(SomeUnit))]
属性。
看起来现在SomeUnit进行了序列化,但是随后引发了反序列化异常:
我该如何解决?
最佳答案
由于您没有显示任何代码,我们只能猜测是什么原因造成的。
如果您将使用具有广义项目类型(例如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
来解决此问题,从而显式声明反序列化器应注意的派生类。[DataContract]
[KnownType(typeof(SomeUnit))]
public class BaseClass
{
...
}
[DataContract]
public class SomeUnit : BaseClass
{
...
}
无法在接口(interface)类型上应用[KnownType]。但是,有一些选项可以支持此操作:
选项1
使用包装契约(Contract)声明已知类型。
[DataContract]
[KnownType(typeof(SomeUnit))]
public class Wrapper
{
[DataMember]
public IUnit Value { get; set; }
}
[DataContract]
public class SomeUnit : IUnit
{
...
}
选项#2
指定DataContractSerializer constructor的已知类型。
但是,这需要您tell service fabric to use your custom serializer。
选项#3
在配置文件(app.config)中将已知类型指定为described here。