可靠的收集(队列)值存储一些复杂类型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

10-08 08:04