加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – protobuf-net继承

发布时间:2020-12-15 06:32:17 所属栏目:百科 来源:网络整理
导读:Marc在stackoverflow上提到,在protobuf-net v2中,使用ProtoInclude属性(或类似方法)可以对类层次结构进行序列化/反序列化,而无需在基类中指定每个子类型.这是否实现?我们有一个可以在外部库中导出的插件接口,所以没有办法知道派生类型将是什么.我们可以在类
Marc在stackoverflow上提到,在protobuf-net v2中,使用ProtoInclude属性(或类似方法)可以对类层次结构进行序列化/反序列化,而无需在基类中指定每个子类型.这是否实现?我们有一个可以在外部库中导出的插件接口,所以没有办法知道派生类型将是什么.我们可以在类型之间保持唯一的编号,但是在网络上找不到任何示例,缺少使用要指定子类型的ProtoInclude属性.

如果我不知道什么是子类型,那么我将如何使用protobuf-net来实现继承?

解决方法

如果您不能在属性中指定子类型(因为在编译时不知道),您有2个选项(两个选项仅适用于“v2”,可用作beta):

>使用RuntimeTypeModel,而不是静态Serializer方法(现在只是RuntimeTypeModel.Default的简写);告诉模型关于继承(下面的例子)
>将DynamicType = true添加到[ProtoMember(…)]中

第二个不是很纯粹的原型 – 它嵌入了类型信息,我不太喜欢,但人们不断要求.第一个是我的首选.在运行时添加子类型:

var model = TypeModel.Create();
var type = model.Add(typeof(YourBaseType),true);
var subTypeA = model.Add(typeof(SomeSubType),true);
var subTypeB = model.Add(typeof(SomeOtherSubType),true);
type.AddSubType(4,typeof(SomeSubType));
type.AddSubType(5,typeof(SomeOtherSubType));

上面的意思是“使用正常规则自动添加成员属性” – 您还可以控制它,如果愿意,手动指定属性(etc).

请注意,TypeModel应该被缓存并重新使用(不需要为每个对象进行序列化创建),因为它包含一些“emit”代码来生成方法.重新使用它会更快,需要更少的内存.类型模型是线程安全的,可以用于在不同的线程上同时序列化/反序列化多个流.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读