结构不是 protobuf-net 中有效的接口子类型

Posted

技术标签:

【中文标题】结构不是 protobuf-net 中有效的接口子类型【英文标题】:Struct is not a valid sub-type of interface in protobuf-net 【发布时间】:2021-03-15 13:56:04 【问题描述】:

是否可以在 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 inheritance),我应该能够使用AddSubType 将类型添加到RuntimeTypeModel,然后序列化SerializationStruct 的实例。

如果我使用 MyData1MyData2 的类,这可行,但如果我使用结构(如上),我会收到错误:

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

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

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

【问题讨论】:

你从哪里得到这个异常?你能创建一个minimal reproducible example 吗?听起来您要么没有在 MyData1 上正确实现 IData,要么您指的是完全不同的接口,您得到了异常。 @ConnorLow 谢谢;发布的代码应该足以导致问题,但我已经在问题中添加了导致错误的特定行 【参考方案1】:

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

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

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

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

【讨论】:

以上是关于结构不是 protobuf-net 中有效的接口子类型的主要内容,如果未能解决你的问题,请参考以下文章

Protobuf-net 是不是有计划包括验证?

protobuf-net 并使用接口序列化链表

protobuf-net 是不是支持命名元组?

protobuf-net 是不是适合序列化任意对象/域模型?

Protobuf-Net 似乎重用现有对象而不是创建和分配新对象

使用成员编号保存文档,而不是使用 protobuf-net 和 MongoDB 的名称