.net 通过调用AddSubType动态修改ProtoBuf.Meta.MetaType会引发异常

.net 通过调用AddSubType动态修改ProtoBuf.Meta.MetaType会引发异常,.net,protobuf-net,.net,Protobuf Net,我试图使用ProtoBuf Net创建一个类型不可知的序列化程序,它序列化以前未知类型的实例。 为此,我使用ProtoBuf.Meta.RuntimeTypeModel,动态地添加提供给泛型序列化程序的对象类型。 在添加类型时,我使用反射递归地添加完整的类型层次结构:我通过调用myTypeModel.Addtype,true和MyBaseTypeTypeMetaType.AddSubsubjectIndex,type来添加类型 这很好,除非我已经使用序列化程序序列化了一个类型,然后尝试向该类型添

我试图使用ProtoBuf Net创建一个类型不可知的序列化程序,它序列化以前未知类型的实例。 为此,我使用ProtoBuf.Meta.RuntimeTypeModel,动态地添加提供给泛型序列化程序的对象类型。 在添加类型时,我使用反射递归地添加完整的类型层次结构:我通过调用myTypeModel.Addtype,true和MyBaseTypeTypeMetaType.AddSubsubjectIndex,type来添加类型

这很好,除非我已经使用序列化程序序列化了一个类型,然后尝试向该类型添加子类型。然后,我得到了一个InvalidOperationException:一旦为Serialization.Test.Address生成了序列化程序,就无法更改类型

我试图将模型的自动编译属性设置为false,但这并不能解决我的问题

我对这个问题的理解是,默认情况下,protobuf net在需要序列化类型时会为该类型创建一个序列化程序,一旦完成,protobuf.Meta.MetaType就无法修改。 这是正确的吗

我做错什么了吗

有没有其他方法可以实现我的目标

谢谢你的帮助


Louis

它确实想事先知道类型,否则它怎么知道它可以反序列化呢。此外,请注意,在使用索引时,当您想要反序列化相同的数据时,能够可靠地生成相同的键/类型映射非常重要

一个简单的选择,目前可行,就是创建一个全新的TypeModel,使用旧数据加上新数据;当然,这不是很方便。我可能支持对模型的序列化器进行全局重置,但它必须释放整个模型


第三个也是最简单的选择当然是:提前知道类型。毕竟-如果您没有已知/固定的定义,以后可能无法复制数据。

谢谢标记。我已经选择了简单的解决方案来重新创建一个新模型。在我的用例中,我希望有有限数量的未知类型,因此,一旦系统处于稳定状态,我就不再需要重新创建模型。另外,我想使用proto-buf来序列化两个实体之间的数据交换。因此,如果它们共享相同的已发现类型,并且我以一致的方式添加该类型,那么我就可以了。@user1167325 yes;如果你能以一致的方式添加它们,那就好了