(转)在ios android设备上使用 Protobuf (使用dll方式)
自:http://game.ceeger.com/forum/read.php?tid=13479
如果你的工程可以以.Net 2.0 subset模式运行,请看这个帖子中的方法。
地址:http://game.ceeger.com/forum/read.php?tid=14359&fid=27
如果只能以.Net 2.0下运行,就可以继续往下看了。
=============================================================
protobuf是google定制的一个协议,可以方便地进行数据的序列化和反序列操作。(支持多个平台间通信)
可以用它来进行数据的本地缓存
以及 网络协议的传输 等等。
要了解protobuf协议看下面两个网址:
http://code.google.com/p/protobuf/
https://developers.google.com/protocol-buffers/docs/tutorials
Unity有两个Protobuf库可以用分别是 protobuf-csharp-port, protobuf-net (后者效率更高)
两个库使用都可以在android上运行正常,但是在ios上面会出现下面的异常:
ExecutionEngineException:
Attempting to JIT compile method
JIT意思就是运行时编译,而ios上是aot (full)编译,因此任何库只要使用jit方式都无法在ios上运行。
要了解jit以及aot,请看下面的网址:
JIT:http://en.wikipedia.org/wiki/Just-in-time_compilation
AOT:http://en.wikipedia.org/wiki/AOT_compiler
http://www.mono-project.com/AOT
经过尝试之后,可以用protobuf-net的预编译来在ios以及android设备上运行
接下来按步骤讲解,最后会附上测试工程。
一、 下载protobuf-net 及配置
到http://code.google.com/p/protobuf-net/downloads/list 去下载protobuf-net最新发布版本(写这篇教程的时候最新版本是r668)
下载之后解压到你的硬盘的某个目录 , 最好是将 Precompile\precompile.exe 以及 ProtoGen\protogen.exe 两个文件加入到环境变量中 , 之后方便使用。
我们还需要CoreOnly\ios中的三个文件,之后会用到,而且最终会放到unity工程下。
二、生成cs代码
使用protogen 命令行来生成代码 (precompile以及protogen都只能在windows下运行,在mac上可能可以通过mono来运行这个exe,但是没有试过。)
使用例子如下:
protogen -i:Test1.proto -i:Test2.proto -i:Test3.proto -o:Output.cs -ns:com.fbmly.model
-i 是输入文件,可以有多个
-o 输出的cs文件, 只能有一个..如果-i有多个 会将所有的代码生成到这一个cs文件当中
-ns 命名空间 最好使用,如果不使用每次生成的默认命名空间是proto的文件名。
通常来说 只要把所有的数据结构生成到一个cs就行了(要不然使用多个-i , 要不就把所有protobuf定义写在一个proto文件中),这样之后之后操作比较方便一些。
经过这一步你就得到了生成之后的cs文件。
三、编译dll库
使用MonoDevelop工具 将上一步生成的cs文件编译成dll库.
1.创建一个新的工程 (File->New->Solution)
2.在弹出的对话框中选择 C# 再选择 Library.
3.在下方填写好工程的名字 (这个名字是生成dll的名字,所以要起好)
4.点击forward (之后还要点一次ok)
5.删掉默认生成的MyClass.cs文件,有必要的话在AssemblyInfo.cs里填写一些版权信息。
6.将上一步用protogen生成的cs文件 加入到工程 (在左边工程名 上右键 就可以添加)
7.添加protobuf-net引用库
点击工程的References->Edit References
然后选择刚才的CoreOnly\ios下的dll库 , 双击库文件就可以加到右边
最后检查下References里面如果有protobuf-net.dll就正确了。
8.都做好后, 点击Build->Build All就可以在当前工程生成dll了
不要忘记 debug 和 release的选择 ,测试完后应该重新拿release再编译一次的。
9. 左下角提示成功 就 会在当前工程目录下生成dll文件了 (我这里是 TestModel.dll)
这个dll存放的是你所有的数据结构。
四、预编译序列化库
上一步生成了数据的dll文件,这一步需要用到上一步的dll文件来生成专门序列化的dll文件。
首先要保证TestModel.dll和编译时所使用的库在同一目录 ( 上一步生成的dll文件目录,会自动把protobuf-net库文件也复制过来 , 所以只需要记住这一点就行了。 比如你要是复制到其他目录进行操作, 这点会很重要 )
然后打开命令行, 定位到dll工程目录下的bin\Debug 或 bin\Release目录
然后执行以下命令(修改成你所设置的名字):
precompile TestModel.dll -o:ProtobufSerializer.dll -t:com.fbmly.ProtobufSerializer
TestModel.dll就是上一步生成的dll文件,-o是生成的文件名 -t是在ProtobufSerialize.dll中所生成的序列化类的类名 支持命名空间,不用命名空间就直接写类名就可以了。
如果最后有 All Done 提示, 就代表生成成功了。
复制代码
1
2
3
4
5
6
7
8
9
10
|
D:\protobuf-net\Precompile\Model>precompile TestModel.dll -o:ProtobufSerializer.
dll -t:com.fbmly.ProtobufSerializer
protobuf-net pre-compiler
Detected framework: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727
Resolved C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll
Resolved C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.dll
Resolved protobuf-net.dll
Adding Fbmly1.Fbmly...
Compiling com.fbmly.ProtobufSerializer to ProtobufSerializer.dll...
All done
|
五、在unity中测试
将第三步和第四步中生成的 TestModel.dll ,ProtobufSerializer.dll 以及参与编译的protobuf-net库 复制到unity的工程中去。
现在可以开始测试了
测试代码:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
void OnGUI( )
{
if ( GUILayout.Button ( "Test" , GUILayout.Width ( 200f ) , GUILayout.Height ( 200f ) ) )
{
Fbmly data = new Fbmly ( );
data.mmm = 10;
ProtobufSerializer serializer = new ProtobufSerializer ( );
//Serialize
byte [] buffer = null ;
using ( MemoryStream m = new MemoryStream ( ) )
{
serializer.Serialize ( m , data );
m.Position = 0;
int length = ( int )m.Length;
buffer = new byte [length];
m.Read(buffer, 0 ,length);
}
Fbmly newData = null ;
//Deserialize
using ( MemoryStream m = new MemoryStream ( buffer ) )
{
newData = serializer.Deserialize ( m , null , typeof ( Fbmly ) ) as Fbmly;
}
Debug.Log ( "newData.mmm=" + newData.mmm );
}
}
|
测试工程已经在touch4上测试通过,并且工程设置为.Net 2.0 Subset
如果各位在真机上出现错误,不妨设置到.Net 2.0试试。
这种方式已经在游戏项目中验证过了,复杂的数据也是没有问题的(游戏项目用了500多个proto定义) , ios和android都可用。
最后附上工程包:里面附了一个工具类,可以序列化的时候使用, 用的时候只需要修改一下就可以了,因为里面维护了一个序列化类的单例。
ProtobufTest.unitypackage
或者在这里下载:
http://pan.ceeger.com/viewfile.php?file_id=1824
转载于:https://www.cnblogs.com/wonderKK/p/3969712.html
(转)在ios android设备上使用 Protobuf (使用dll方式)相关推荐
- 微软云平台媒体服务实践系列 1- 使用静态封装为iOS, Android 设备实现点播(VoD)方案...
微软的云平台媒体服务为流媒体服务提供了多种选择,在使用流媒体服务为企业做流媒体方案时,首先需要确认要流媒体接收目标,如针对广大iOS, Android移动设备,由于它们都支持HLS 格式的流媒体,基于 ...
- 在 Android 设备上搭建 Web 服务器
在 Android 设备上搭建 Web 服务器 叶志陈已关注 12018.04.11 00:20:05字数 1,018阅读 10,291 一般而言,Android 应用在请求数据时都是以 Get 或 ...
- Android设备上一张图片的显示过程
转自:http://blog.csdn.net/jxt1234and2010/article/details/50524213 Android设备上一张图片的显示过程 应用示例 假如我们现在有一张这样 ...
- android手机icoude邮件,如何在Android设备上访问Apple应用和数据?教程来了!
原标题:如何在Android设备上访问Apple应用和数据?教程来了! 对于一些出于工作原因,拥有ios和Android不同系统手机的人来说,有时候会觉得在共享资料或数据上会比较麻烦.但是,其实并非如 ...
- 设置android启动器,教程:在任意 Android 设备上安装 HTC 专属桌面启动器
HTC 手机的标志性 Sense UI 几乎是伴随着 Android 系统成长起来的,BlinkFeed 作为 Sense 5 的新特性进入了人们的视野之中.经历了几代更新,BlinkFeed 受到更 ...
- 如何查看Android设备上的分区信息
Android设备上,一般都会存在一块eMMC存储芯片来存放系统和用户数据,甚至部分的引导程序. 一般设备出厂时,各个厂商都会将这块存储芯片分成很多的分区,每个分区内存放不同的内容.具体分区的布局每个 ...
- java图像分类源码_在Android设备上使用NCNN图像分类的demo
[实例简介] 在Android设备上使用NCNN图像分类的demo,是一个Android项目 [实例截图] [核心代码] NCNN1 └── NCNN1 ├── app │ ├── app.iml ...
- OpenCV在Android设备上运行深度网络
OpenCV在Android设备上运行深度网络 在Android设备上运行深度网络 介绍 要求 创建一个空的Android Studio项目 添加OpenCV依赖项 做一个样品 在Android设备上 ...
- android 摄像头参数,获取Android设备上的详细的摄像头信息
原标题:获取Android设备上的详细的摄像头信息 如何获取Android设备上的详细的摄像头信息呢? 目前Samsung的Galaxy Tab和Nexus S均有前置摄像头,获取Android摄像头 ...
最新文章
- 2万人同时访问 nodejs_Nodejs 与 Python 的使用对比
- 深度学习在锦囊细选上的应用
- SameSite Cookie,防止 CSRF 攻击
- 10.18.1 linux文本编辑器vim
- iOS消息推送整体流程
- (z)如何在SignalTAP II中保留特定节点
- 新手入门之VIM 编辑小技巧
- 三星首款5nm A78旗舰芯Exynos 1080即将亮相
- Python 数据结构与算法 —— 插入排序
- 2015年,我们一起经历的IT安全事件
- 《Haskell函数式编程入门》—— 第1章,第1.6节本章小结
- qt中如何使用mysql_qt中如何使用mysql 以及静态编译qt中如何加上mysql(1)
- IP归属地查询API
- 逻辑函数代数法化简(一)
- 【多轮对话】任务型多轮对话数据集和采集方法
- 投稿状态(status)记录 IEEE wireless communications letters (IEEE WCL)
- nrf52840开发笔记(一)------开发环境搭建
- Windows批量修改文件名
- 计算机负数的绝对值,负数的绝对值是什么
- 一款不错的流式布局LayoutManager-FlowLayout
热门文章
- 空间谱专题06:宽带信号处理思路
- mysql 中文字段名_MySQL全文索引怎么做?| 教程分享
- 将html保存为图片,html2canvas 将html代码转为图片并保存下来
- oracle备份 ram,Oracle备份时出现AIX系统的3D32B80D错误
- datanode无法启动_Hadoop DataNode启动和初始化过程
- 电脑声音太小如何增强_感觉手机音量太小了?教你这样设置,声音立马大上许多...
- pandas 每一列相加_Python数据分析——Pandas 教程(上)
- 亚伦•斯沃茨:提升时间的品质
- 单行、多行文本超出显示省略号
- OptaPlanner - 把example运行起来(运行并浅析Cloud balancing)