2

我是一个非常快乐的 protobuf-net 露营者。到目前为止,我一直在使用带有 [ProtoMember]、[ProtoInclude] 和朋友标记的常规 protobuf-net,并取得了巨大成功。

但是现在我意识到我需要转移到 protobuf-net 核心,预生成序列化类,特别是能够在 iOS 上的 Unity 的 AOT 环境中执行。

这一切都很时髦,我特别从这篇博文中找到了一些好的建议,并开始迁移我的 protobuf-net 集成,但是关于这个主题的信息并没有完全散布在互联网上——至少在我的 google-fu 涵盖的范围内没有。

当我一个接一个地遇到障碍,挖掘源代码试图弄清楚发生了什么时,我变得有点沮丧。我真的可以使用一种 protobuf-net 核心与常规品牌的概述/意图/指南。

我最近遇到的是“非公共类型不能与完整的 dll 编译一起使用”限制,目前这似乎有些武断,但考虑到它对我现有设计的影响,这肯定很烦人(这正是我很高兴摆脱的原因我自己喜欢使用 protobuf-net 的常规 .net 二进制序列化程序)。

任何经验分享/事后分析或类似的有用资源将不胜感激。

编辑:只是为了完成,到目前为止,这是我的序列化程序生成器工具:https ://gist.github.com/AngryAnt/a19d8c67155163936aae

4

1 回答 1

1

首先要注意的是您链接到的文章已过时:protobuf-net 本身有工具可以帮助处理这种情况 - 预编译工具。请参阅http://marcgravell.blogspot.co.uk/2012/07/introducing-protobuf-net-precompiler.html

至于对非公共类型的限制:这个限制不是任意的:它是核心 .net 运行时程序集验证的一部分。正式的程序集不能引用不允许的东西。如果它尝试过,它不会通过验证。在内存中运行时,您可以摆脱一些烟雾和镜子,但不能作为 dll。

然而!这里仍然有一个潜在的选择——尤其是[InternalsVisibleTo]。我已经做了一些工作来让预编译器使用这个属性来做一些事情。我怀疑如果您愿意将序列化 dll 指定为“允许”,那么它要么已经工作,要么可以调整工作。我真的不记得(不检查)这个场景是否包含在内 - 但我怀疑它是。

这可能更像是 protobuf-net 本身的讨论,而不是 stackoverflow 问题。可能值得我们把它带到那里。

于 2013-05-30T19:45:12.543 回答