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

Protobuf-net how to copy a RuntimeTypeModel into another?

问题的上下文:我需要修改一个 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
}

请注意,在您的情况下,可能将这些定义存储在 external 某处到 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
};

不过,我要强调的是,“更早地了解子类型”是解决这种情况的更简单的方法,即使这意味着更早地加载程序集。如果您要加载它们 无论如何,延迟它们似乎会使代码复杂化。