c# - 结构不是 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 继承),我应该能够将类型添加到RuntimeTypeModel
usingAddSubType
然后序列化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));
解决方案
我通过切换到另一个库来序列化(MessagePack)来“解决”这个问题,它能够使用Unions处理这种情况。回到 protobuf-net,它似乎也支持discriminated unions,虽然我找不到任何关于如何的文档,我也没有进一步了解。
我还查看了 protobuf-net 中导致特定错误的代码,它似乎(我认为)明确拒绝使用结构作为子类型:
private bool IsValidSubType(Type subType)
{
return subType is object && !subType.IsValueType
&& Type.IsAssignableFrom(subType);
}
所以我想我的问题的直接答案是“不”,但实际的答案是“可能有正确的方法来做到这一点”
推荐阅读
- c++ - VSCode 中的 Code Runner 在输出中运行,而不是终端中的 CMD
- javascript - 导出的对象无法识别 javascript 中的函数
- data-structures - 链表 - 数据结构
- python - 如何在python3中使用列表理解从2个列表中编程更大的无查找器
- angular - Angular 9:CORS 策略已阻止从源“http://localhost:4200”访问“xxx”处的 XMLHttpRequest
- python - Discord.py 如何使下一个用户的消息成为变量?
- php - 文件`{$path}`在laravel中不存在错误
- python - 爬行后刮掉奇怪的输出
- c++ - 如何获取对象的名称
- python - 如何从另一个 .py 调用 Python 代码?(当我按空格键时,两个 .py 都在同一个文件中)