首页 > 解决方案 > 结构不是 protobuf-net 中有效的接口子类型

问题描述

是否可以在 protobuf-net 中序列化接口类型的结构,或者这只适用于接口类型的类?

我有许多想要序列化的结构,所有这些都实现了一个接口。我目前将它们包装在另一个结构中(连同一些元数据)以执行序列化:

[ProtoContract]
public interface IData {}

[ProtoContract]
public struct MyData1 : IData { }
[ProtoContract]
public struct MyData2 : IData { }

[ProtoContract]
public struct SerializationStruct {
    [ProtoMember(1)]
    public int SomeMetadata;
    [ProtoMember(2)]
    public IData Content
}

通过阅读其他答案(例如protobuf-net 继承),我应该能够将类型添加到RuntimeTypeModelusingAddSubType然后序列化SerializationStruct.

如果我使用类,这有效MyData1MyData2但如果我使用结构(如上)我得到错误:

System.ArgumentException: MyData1 is not a valid sub-type of IData. Parameter name: derivedType

当我尝试将其添加到模型中时,如下所示:

RuntimeTypeModel.Default[typeof(IData)].AddSubType(1, typeof(MyData1));

标签: c#structprotobuf-net

解决方案


我通过切换到另一个库来序列化(MessagePack)来“解决”这个问题,它能够使用Unions处理这种情况。回到 protobuf-net,它似乎也支持discriminated unions,虽然我找不到任何关于如何的文档,我也没有进一步了解。

我还查看了 protobuf-net 中导致特定错误的代码,它似乎(我认为)明确拒绝使用结构作为子类型:

    private bool IsValidSubType(Type subType)
    {
        return subType is object && !subType.IsValueType
            && Type.IsAssignableFrom(subType);
    }

所以我想我的问题的直接答案是“不”,但实际的答案是“可能有正确的方法来做到这一点”


推荐阅读