限制protobuf-net继承“树”的深度

5
继续追求将protobuf-net屈服于我的意愿...
我在Stack Overflow上看到了一些关于如何动态添加子类以使得序列化器能够对子类进行编码的问题,例如 thisthis 我的情况有点不同,我有一个基类,在后期绑定的代码中可能会被子类化,并且我想将其序列化为BASE类,并完全忽略子类的字段/属性。
我需要这样做的原因是,稍后当我反序列化数据时,子类的代码甚至不可用,因此构造子类甚至都不可能。
有没有办法限制/禁止子类序列化?
在我的情况下,我有一个List,其中一些项目是DerivedClass。
我想找到一种方法,使protobuf-net将所有内容都序列化为BaseClass,并且也可以反序列化为BaseClass...
我尝试过查看代码,但并没有找到太有用的东西。
1个回答

2

通常情况下,库非常注重识别派生类,并将其与基类区分对待。目前唯一的例外是代理类,特别是Entity Framework和NHibernate。为了得到一个整洁的解决方案,似乎很实用地增加一些“忽略子类”的开关。但是,由于这种开关并不存在,一个非常懒惰(且hacky)的方法是通过现有的NHibernate处理来欺骗,例如:

namespace NHibernate.Proxy {
    interface INHibernateProxy {}
}
...
public class SomeDerivedType : BaseType, INHibernateProxy {}

这样做将自动序列化成BaseType。尽管如此,它确实有点作弊的味道。


1
@damageboy 如果你想为此添加一些自定义机制,TypeModel.ResolveProxies 值得一看。我不反对在这里添加一个特定于 protobuf-net 的 API。 - Marc Gravell
嗨,马克,最终我在MetaType上添加了一个属性:“FlattenUnexpectedSubtypes”,这将根据此标志的存在更改代码生成器发出的IL...看起来工作正常...我几天前尝试向您发送了一些其他功能的补丁,但没有得到任何回应...如果电子邮件是沟通补丁的首选方法吗? - damageboy
@damageboy 没有任何冒犯之意;我的收件箱是一个充满危险的地方... 我稍后会检查。 - Marc Gravell
2
@MarcGravell 这个问题有被修补过吗?我需要这个功能。 - David Pfeffer
@MarcGravell 这个问题最终有解决方案了吗?或者在v2中有新的解决方法吗? - Jeremy Seekamp
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接