我是一个非常开心的protobuf-net露营者。到目前为止,我一直在使用常规protobuf-net与[ProtoMember],[ProtoInclude]和朋友标记取得巨大成功。
但是现在我意识到我需要转移到protobuf-net核心,预生成序列化类,特别是能够在iOS的AOT环境中执行。
这一切都很时髦,我从表面this blog post找到了一些好的指针,并开始迁移我的protobuf-net集成,但是关于这个主题的信息并没有完全乱扔垃圾网 - 至少没有延伸到我的google-fu。
当我遇到另一个障碍时,挖掘源头以试图弄清楚发生了什么,我变得有点沮丧。我真的可以使用protobuf-net core与普通品牌的概述/意图/指南。
我最近的遭遇是“非公共类型不能与完整的dll编译一起使用”限制,此刻似乎有些随意,但鉴于它对我现有设计的影响(我之所以这样的原因)肯定非常烦人很高兴摆脱常规的.net二进制序列化器,转而使用protobuf-net。
非常感谢任何经验分享/事后或类似的有用资源。
编辑:只是为了完成,到目前为止这是我的序列化生成器工具:https://gist.github.com/AngryAnt/a19d8c67155163936aae
答案 0 :(得分:1)
首先要注意的是,您链接到的文章已过时:protobuf-net本身有工具来帮助处理这种情况 - 预编译工具。请参阅http://marcgravell.blogspot.co.uk/2012/07/introducing-protobuf-net-precompiler.html
对于非公共类型的限制:此限制不是任意的:它是核心.net运行时的程序集验证的一部分。正式的程序集不能引用不允许的事物。如果尝试过,它将无法通过验证。在内存中运行时,您可以使用一些烟雾和镜子,但不能作为dll。
然而!这里仍有一个选项 - 特别是[InternalsVisibleTo]
。我已经做了一些工作来让预编译器使用这个属性做事。我怀疑,如果您乐意将序列化dll指定为“允许”,那么它将已经工作,或者可以调整它来工作。我真的不记得(没有检查)这个场景是否包含在那些场景中 - 但我怀疑它是。
对于protobuf-net本身而言,这可能更像是讨论的事情,而不是堆栈溢出问题。我们可能值得我们把它带到那里。