自: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. 微软云平台媒体服务实践系列 1- 使用静态封装为iOS, Android 设备实现点播(VoD)方案...

    微软的云平台媒体服务为流媒体服务提供了多种选择,在使用流媒体服务为企业做流媒体方案时,首先需要确认要流媒体接收目标,如针对广大iOS, Android移动设备,由于它们都支持HLS 格式的流媒体,基于 ...

  2. 在 Android 设备上搭建 Web 服务器

    在 Android 设备上搭建 Web 服务器 叶志陈已关注 12018.04.11 00:20:05字数 1,018阅读 10,291 一般而言,Android 应用在请求数据时都是以 Get 或 ...

  3. Android设备上一张图片的显示过程

    转自:http://blog.csdn.net/jxt1234and2010/article/details/50524213 Android设备上一张图片的显示过程 应用示例 假如我们现在有一张这样 ...

  4. android手机icoude邮件,如何在Android设备上访问Apple应用和数据?教程来了!

    原标题:如何在Android设备上访问Apple应用和数据?教程来了! 对于一些出于工作原因,拥有ios和Android不同系统手机的人来说,有时候会觉得在共享资料或数据上会比较麻烦.但是,其实并非如 ...

  5. 设置android启动器,教程:在任意 Android 设备上安装 HTC 专属桌面启动器

    HTC 手机的标志性 Sense UI 几乎是伴随着 Android 系统成长起来的,BlinkFeed 作为 Sense 5 的新特性进入了人们的视野之中.经历了几代更新,BlinkFeed 受到更 ...

  6. 如何查看Android设备上的分区信息

    Android设备上,一般都会存在一块eMMC存储芯片来存放系统和用户数据,甚至部分的引导程序. 一般设备出厂时,各个厂商都会将这块存储芯片分成很多的分区,每个分区内存放不同的内容.具体分区的布局每个 ...

  7. java图像分类源码_在Android设备上使用NCNN图像分类的demo

    [实例简介] 在Android设备上使用NCNN图像分类的demo,是一个Android项目 [实例截图] [核心代码] NCNN1 └── NCNN1 ├── app │   ├── app.iml ...

  8. OpenCV在Android设备上运行深度网络

    OpenCV在Android设备上运行深度网络 在Android设备上运行深度网络 介绍 要求 创建一个空的Android Studio项目 添加OpenCV依赖项 做一个样品 在Android设备上 ...

  9. android 摄像头参数,获取Android设备上的详细的摄像头信息

    原标题:获取Android设备上的详细的摄像头信息 如何获取Android设备上的详细的摄像头信息呢? 目前Samsung的Galaxy Tab和Nexus S均有前置摄像头,获取Android摄像头 ...

最新文章

  1. 2万人同时访问 nodejs_Nodejs 与 Python 的使用对比
  2. 深度学习在锦囊细选上的应用
  3. SameSite Cookie,防止 CSRF 攻击
  4. 10.18.1 linux文本编辑器vim
  5. iOS消息推送整体流程
  6. (z)如何在SignalTAP II中保留特定节点
  7. 新手入门之VIM 编辑小技巧
  8. 三星首款5nm A78旗舰芯Exynos 1080即将亮相
  9. Python 数据结构与算法 —— 插入排序
  10. 2015年,我们一起经历的IT安全事件
  11. 《Haskell函数式编程入门》—— 第1章,第1.6节本章小结
  12. qt中如何使用mysql_qt中如何使用mysql 以及静态编译qt中如何加上mysql(1)
  13. IP归属地查询API
  14. 逻辑函数代数法化简(一)
  15. 【多轮对话】任务型多轮对话数据集和采集方法
  16. 投稿状态(status)记录 IEEE wireless communications letters (IEEE WCL)
  17. nrf52840开发笔记(一)------开发环境搭建
  18. Windows批量修改文件名
  19. 计算机负数的绝对值,负数的绝对值是什么
  20. 一款不错的流式布局LayoutManager-FlowLayout

热门文章

  1. 空间谱专题06:宽带信号处理思路
  2. mysql 中文字段名_MySQL全文索引怎么做?| 教程分享
  3. 将html保存为图片,html2canvas 将html代码转为图片并保存下来
  4. oracle备份 ram,Oracle备份时出现AIX系统的3D32B80D错误
  5. datanode无法启动_Hadoop DataNode启动和初始化过程
  6. 电脑声音太小如何增强_感觉手机音量太小了?教你这样设置,声音立马大上许多...
  7. pandas 每一列相加_Python数据分析——Pandas 教程(上)
  8. 亚伦•斯沃茨:提升时间的品质
  9. 单行、多行文本超出显示省略号
  10. OptaPlanner - 把example运行起来(运行并浅析Cloud balancing)