我有一个带插件架构的应用程序。插件有自己的数据容器,它们都从基本接口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事件提供自定义映射)
该异常提示我可以通过事件提供格式,但我不知道这有什么用,因为问题是我没有那种类型可用。在这些情况下我想做的是完全忽略反序列化该对象。在这些情况下,列表项甚至可以默认为基类的虚拟实例。但是怎么做呢?
答案 0 :(得分:1)
那(选择跳过或默认)是一个引人入胜的用例,我认为我没有完全考虑过;但是,您可以通过以下方式 自行完成此操作:
public class NilContainer : IPluginDataContainer {}
然后订阅DynamicTypeFormatting
事件;如果您无法识别类型,请提供typeof(NilContainer)
。
即
RuntimeTypeModel.Default.DynamicTypeFormatting += (sender, args) =>
{
Type type;
if(!yourTypeMap.TryGetValue(args.FormattedName, out type))
{
type = typeof (NilContainer);
}
args.Type = type;
};
(完全未经测试)