针对 iOS 的 Unity3D 中的协议缓冲区
Posted
技术标签:
【中文标题】针对 iOS 的 Unity3D 中的协议缓冲区【英文标题】:ProtocolBuffer inside Unity3D targeting iOS 【发布时间】:2012-12-05 14:22:17 【问题描述】:我正在尝试在针对 ios
设备的 Unity3D
项目中使用 Marc Gravell 的 protobuf-net C#
协议缓冲区实现。
我设法使用protogen
从协议缓冲区文件MyFile.proto
创建了一个C#
文件(我们称之为MyFile.cs
)。
一旦导入文件和protobuf-net.dll
(我在unity文件夹中使用dll),我就可以成功反序列化以前序列化的文件(我正在从python代码进行序列化,一切正常):
MyType myType;
using (var file = File.OpenRead("Assets/MyTypeBin"))
myType = ProtoBuf.Serializer.Deserialize<MyType>(file) ;
上述解决方案在模拟器上运行良好,但在针对iOS
设备(es.ipad)时失败。
我试图从unity/protobuf-net.dll
切换到CoreOnly/ios/protobuf-net.dll
,但最后一个编译失败。似乎Deserialize
方法没有在核心dll中声明:
错误 CS0117:
ProtoBuf.Serializer' does not contain a definition for
Deserialize'
我读过这个article,但它似乎已经过时了。它指的是protobuf-net
的旧实现。我希望在此期间有所改变。
我的问题是:
是否可以使用protobuf-net r602
定位来自Unity3D
的iOS
设备,而无需
为您想要的模型类创建一个库 dll(程序集) 序列化/反序列化
喜欢链接博客文章中的建议吗?我想要一个更快的工作流程,可能会直接在Unity3D
项目中导入使用protogen
生成的C#
文件
如果是,怎么做?我需要参考哪个dll
?使上述 sn-p 在iOS
设备上再次工作的步骤是什么?
【问题讨论】:
设备出现什么错误?另外:为了性能,首选的方式是生成一个dto程序集,然后使用“预编译”:iOS上缺乏元编程是原因。 @MarcGravell:很遗憾,我现在没有设备。错误是关于 JIT 的。如果我没有出错的话是这样的: ExecutionEngineException: Attempting to JIT compile method。所以正确的方法是关注链接的博客文章?但它指的是您的软件的过时版本:code.google.com/p/protobuf-net/downloads/…。 【参考方案1】:我相信这是解决方案:
在 iOS 上,Apple 存在一个问题,即不允许在运行时进行 JIT 编译,这会阻止使用 protobuf。可以用 Environment.SetEnvironmentVariable("MONO_REFLECTION_SERIALIZER", "yes");在使用任何 protobuf 之前,但它仅适用于 .NET 4.6。 (我试了3.5,JIT的错误还是出现)
https://github.com/5argon/protobuf-unity
【讨论】:
以上是关于针对 iOS 的 Unity3D 中的协议缓冲区的主要内容,如果未能解决你的问题,请参考以下文章