具有代理和继承层次结构的 protobuf-net v3

Posted

技术标签:

【中文标题】具有代理和继承层次结构的 protobuf-net v3【英文标题】:protobuf-net v3 with surrogate and inheritance hierarchies 【发布时间】:2021-06-29 12:34:05 【问题描述】:

对于用作ProtoContracts 的现有类型层次结构,我正在努力从 protobuf-net v2.4.6 迁移到 v3.0.100(或任何 3.0.x),其中一个是由于其属性之一是 object 类型而需要代理的子类型。

使用之前的配置,我在创建运行时模型时抛出以下异常: System.InvalidOperationException: '具有代理项的类型不能用于继承层次结构'

因此,我的问题是如何使用 protobuf-net 3.0.x 正确处理这种情况?

这是我对这个问题的(过度)简化的再现:

class Program

    static void Main(string[] args)
    
        var model = RuntimeTypeModel.Create();
        _ = model[typeof(Base)]; // <-- InvalidOperationException thrown here

        Base value = new Complex();
        var copy = model.DeepClone(value);
    


[ProtoContract]
[ProtoInclude(1, typeof(Simple))]
[ProtoInclude(2, typeof(Complex))]
public abstract class Base



[ProtoContract]
public class Simple : Base



[ProtoContract(Surrogate = typeof(ComplexSurrogate))]
public class Complex : Base



[ProtoContract(Name = nameof(Complex))]
public class ComplexSurrogate

    [ProtoConverter]
    public static ComplexSurrogate Convert(Complex source) => new ComplexSurrogate();

    [ProtoConverter]
    public static Complex Convert(ComplexSurrogate source) => new Complex();

附带说明:当从源代码编译 protobuf-net 并抑制上述异常时,我可以为 Base 类定义一个代理项,这似乎是一种解决方法.

【问题讨论】:

【参考方案1】:

目前,不支持这种情况。在为 v3 重新编写代码时,发现了一些模棱两可的结果/意图,需要深入了解每种情况下的正确结果是什么,设计如何实现、实施和测试。尚未找到那个时间,因此现在阻止可能导致下游大问题的配置比只是耸耸肩并假设发生的任何事情都是正确的更安全。它在我要做的事情清单上,但是:归根结底,这是一个完全来自我自己业余时间的项目——它不是赞助的,也不是我有偿工作的一部分,所以:当它到达那里时,它就会到达那里.

【讨论】:

以上是关于具有代理和继承层次结构的 protobuf-net v3的主要内容,如果未能解决你的问题,请参考以下文章

Django:找出继承层次结构中的哪个表具有该字段

当在其层次结构中具有菱形继承的类的多重继承时,函数的模糊继承

Sean Parent:对于继承层次结构中的多态类型,具有可变对象是极端的例外

spring静态代理和动态代理

在平行继承层次结构中通过父母关联孩子

iOS 的视图层次结构继承关系及常用结构体探讨