Protobuf-net如何将一个RuntimeTypeModel复制到另一个



问题的上下文:我需要修改RuntimeTypeModel实例来添加新的子类型,但在创建并使用了序列化程序之后。我从其他问题中了解到,一旦创建了序列化程序,就不能更改模型,所以我想我应该创建一个新模型,复制旧模型中的信息,然后修改新模型。但我不知道如何正确地复制。。。任何帮助都将不胜感激!

从注释中,您似乎在谈论克隆子类型定义;这样做的一种方法是:

// given "RuntimeTypeModel oldModel", "MetaType newMetaType" and "Type dataType"
if (oldModel.IsDefined(dataType))
{
var oldSubTypes = oldModel[dataType].GetSubtypes();
foreach (var subType in oldSubTypes)
{
newMetaType.AddSubType(subType.FieldNumber, subType.DerivedType.Type);
}
// TODO: add the new sub-types here
}

请注意,在您的情况下,可能会在需要时将这些定义存储在外部到protobuf-net的某个地方,并从那里获取它们,而不必保留旧模型。在任何一种情况下,我都建议使用AfterApplyDefaultBehaviour回调,这将更容易避免时间复杂(这允许您在发现类型时挂接库内发生的代码(:

newModel.AfterApplyDefaultBehaviour += (sender, args) =>
{
var dataType = args.Type;
var newMetaType = args.MetaType;
// your code to apply the sub-types here, perhaps from the above
};

然而,我应该强调的是;更早地知道子类型";是该场景的一个简单得多的解决方案,即使这意味着要更早地加载程序集。如果您无论如何都要加载它们,那么延迟它们似乎会使代码复杂化。

相关内容

  • 没有找到相关文章

最新更新