【发布时间】: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 类定义一个代理项,这似乎是一种解决方法.
【问题讨论】:
标签: c# protobuf-net