限制 protobuf-net 继承“树”

Posted

技术标签:

【中文标题】限制 protobuf-net 继承“树”【英文标题】:Limiting protobuf-net inheritance "tree" 【发布时间】:2011-10-03 20:54:07 【问题描述】:

继续我的任务,让 protobuf-net 符合我自己的意愿..

我已经看到一些关于如何动态添加子类的问题 使序列化程序能够对子类进行编码..,例如 this 或 this

我的情况有点不同,我有一个基类,它可能在后期有界代码中被子类化,我想序列化为 BASE 类,并完全忽略子类的字段/属性。

之所以需要这个,是因为后面我反序列化数据的时候,子类的代码甚至都不可用,所以连子类的构造都不可能。

有没有办法限制/禁止子类序列化?

就我而言,我有一个列表,其中列表中的某些项目是 DerivedClass。

我想找到一种方法让 protobuf-net 将所有内容序列化为 BaseClass 并反序列化为 BaseClass...

我尝试过查看代码,但没有发现有用的东西。

【问题讨论】:

【参考方案1】:

通常,该库非常注重发现派生类 - 并将它们与基类区别对待。唯一的当前 例外是代理类,特别是实体框架和 NHibernate。对于 tidy 解决方案,添加某种“忽略子类”开关似乎很实用。但是,虽然这不存在,但非常懒惰(和 hacky)的方法是使用 NHibernate 的现有处理来作弊,例如:

namespace NHibernate.Proxy 
    interface INHibernateProxy 

...
public class SomeDerivedType : BaseType, INHibernateProxy 

这将自动按照BaseType 进行序列化。不过,它确实有一点作弊的味道。

【讨论】:

你说有点微弱的味道? ;) 我想我会侵入 Coe 的源代码,但感谢您的建议 @damageboy 如果您想为此添加一些自定义机制,TypeModel.ResolveProxies 值得一看。我不反对在这里添加一个 protobuf-net 特定的 API。 所以我们在这里很清楚......您将我指向 ResolveProxies 的原因是因为它是从 ThrowUnexpectedSubtype 调用的,作为抛出异常之前的最后手段? @damageboy,IIRC,有 个地方(不仅仅是ThrowUnexpectedSubtype)使用该方法作为第二次机会 - 最重要的是TypeModel.GetKey(其中它是如何从Type) 和FindOrAddAuto / FindWithoutAdd 中选择策略的。 @MarcGravell 这有没有被修补过?我需要这个功能。

以上是关于限制 protobuf-net 继承“树”的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 protobuf-net 处理 .proto 文件

序列化动态类型参数 Protobuf-net

使用protobuf-net继承时如何选择字段号?

Protobuf-net.Grpc 服务契约继承

用于继承的 Protobuf-net .proto 文件生成

如何停止使用 Protobuf-Net 继承,直接使用继承类?