结构不是 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
的实例。
如果我使用 MyData1
和 MyData2
的类,这可行,但如果我使用结构(如上),我会收到错误:
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 是不是适合序列化任意对象/域模型?