2

我有一个带有插件架构的应用程序。插件有自己的数据容器,它们都继承自基本接口 IPluginDataStorage。DataStorage 对象被序列化以保留状态,它包含这些子类的列表以及其他数据。DynamicType 标志设置为 true,因为直到运行时才知道正在使用哪些插件。

[Serializable]
[ProtoContract]
public class DataStorage
{
    [ProtoMember(200, DynamicType = true)]
    public List<IPluginDataContainer> PluginDataStorage { get; set; }

序列化此设置时工作正常,但我在可靠地反序列化列表时遇到问题。如果我尝试反序列化对象而无法访问序列化时使用的所有插件,我自然会得到一个关于缺少类型的异常。

无法解析类型:NOSMemoryConsumptionPlugin.NOSMemoryConsumptionData,NOSMemoryConsumptionPlugin,Version=1.2.0.17249,Culture=neutral,PublicKeyToken=null(您可以使用 TypeModel.DynamicTypeFormatting 事件来提供自定义映射)

异常提示我可以通过事件提供格式,但我看不出这有什么帮助,因为问题是我没有可用的类型。在这些情况下,我想做的是完全忽略反序列化该对象。在这些情况下,列表项甚至可以默认为基类的虚拟实例。但是如何做到这一点?

4

1 回答 1

1

那(选择跳过或默认)是一个有趣的用例,我认为我没有充分考虑过;但是,您可以通过以下方式自己执行此操作:

public class NilContainer : IPluginDataContainer {}

然后订阅 DynamicTypeFormatting事件;如果您不认识类型,请提供typeof(NilContainer).

IE

RuntimeTypeModel.Default.DynamicTypeFormatting += (sender, args) =>
{
    Type type;
    if(!yourTypeMap.TryGetValue(args.FormattedName, out type))
    {
        type = typeof (NilContainer);
    }
    args.Type = type;
};

(完全未经测试)

于 2012-05-25T14:27:59.650 回答