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

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

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

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

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

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

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

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

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

【问题讨论】:

    标签: c# .net inheritance protocol-buffers protobuf-net


    【解决方案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 这有没有被修补过?我需要这个功能。
    猜你喜欢
    • 2011-09-09
    • 2012-12-01
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    相关资源
    最近更新 更多