限制 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 文件