在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下运行,就可以继续往下看了。

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下运行,就可以继续往下看了。

=============================================================

 

 

 

 

protobufgoogle定制的一个协议,可以方便地进行数据的序列化和反序列操作。(支持多个平台间通信)

 

可以用它来进行数据的本地缓存

以及 网络协议的传输 等等。

 

要了解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
27
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都可用。

 

 

最后附上工程包:里面附了一个工具类,可以序列化的时候使用, 用的时候只需要修改一下就可以了,因为里面维护了一个序列化类的单例。

相关文章
|
21天前
|
搜索推荐 Android开发 iOS开发
安卓与iOS系统的用户界面设计对比分析
本文通过对安卓和iOS两大操作系统的用户界面设计进行对比分析,探讨它们在设计理念、交互方式、视觉风格等方面的差异及各自特点,旨在帮助读者更好地理解和评估不同系统的用户体验。
18 1
|
2月前
|
物联网 vr&ar Android开发
探索安卓与iOS操作系统的未来发展趋势
【2月更文挑战第9天】本文将深入探讨安卓与iOS操作系统的未来发展趋势。通过分析当前技术发展和市场趋势,我们将探讨移动操作系统在人工智能、虚拟现实、物联网等领域的应用前景,以及如何满足用户需求并提升用户体验。同时,我们还将着重讨论两大操作系统在隐私保护、系统优化和生态建设方面的不断改进。
23 4
|
2月前
|
Android开发
如何用Airtest脚本无线连接Android设备?
如何用Airtest脚本无线连接Android设备?
|
3天前
|
编解码 人工智能 测试技术
安卓适配性策略:确保应用在不同设备上的兼容性
【4月更文挑战第13天】本文探讨了提升安卓应用兼容性的策略,包括理解平台碎片化、设计响应式UI(使用dp单位,考虑横竖屏)、利用Android SDK的兼容工具(支持库、资源限定符)、编写兼容性代码(运行时权限、设备特性检查)以及优化性能以适应低端设备。适配性是安卓开发的关键,通过这些方法可确保应用在多样化设备上提供一致体验。未来,自动化测试和AI将助力应对设备碎片化挑战。
|
19天前
|
搜索推荐 Android开发 iOS开发
安卓与iOS操作系统的发展与比较
在移动互联网时代,安卓和iOS两大操作系统在智能手机市场竞争激烈。本文将从技术架构、生态系统、用户体验等方面对安卓和iOS进行比较分析,探讨它们各自的特点和发展趋势。
|
1月前
|
Shell 开发工具 Android开发
ADB 下载、安装及使用教程:让你更好地管理 Android 设备
ADB 下载、安装及使用教程:让你更好地管理 Android 设备
419 2
|
1月前
|
Web App开发 前端开发 网络安全
前端分析工具之 Charles 录制 Android/IOS 手机的 https 应用
【2月更文挑战第21天】前端分析工具之 Charles 录制 Android/IOS 手机的 https 应用
46 1
前端分析工具之 Charles 录制 Android/IOS 手机的 https 应用
|
1月前
|
人工智能 算法 Android开发
探索未来:Android与iOS在人工智能时代的融合与创新
【2月更文挑战第13天】 在数字化时代的快速发展下,Android与iOS作为两大主流移动操作系统,它们在人工智能(AI)领域的融合与创新已成为推动科技进步的关键力量。本文将从操作系统的核心功能拓展、AI技术的集成应用,以及开发者生态系统的演变三个维度,深入探讨Android和iOS如何在AI时代实现协同发展,以及这一进程对用户体验、应用开发和行业趋势产生的深远影响。通过对比分析和案例研究,我们旨在揭示两大平台在AI驱动下的创新路径,及其对未来科技格局的塑造作用。
|
1月前
|
人工智能 自然语言处理 语音技术
探索未来:安卓与iOS在人工智能领域的竞争与合作
【2月更文挑战第12天】本文深入探讨了安卓和iOS两大操作系统在人工智能(AI)领域的发展现状、竞争态势及未来合作可能性。通过对比分析两系统在AI技术集成、开发者支持、用户体验优化等方面的表现,揭示了它们各自的优势与挑战。文章最终展望了一个既有竞争又充满合作的未来,认为安卓和iOS的共同进步将推动整个人工智能技术向前发展,为用户带来更加智能、便捷的生活体验。
|
1月前
|
搜索推荐 Android开发 iOS开发
探索未来:安卓与iOS双系统的融合与创新
【2月更文挑战第12天】 在数字化时代,智能手机操作系统的发展不仅代表了技术的进步,更是用户体验革新的前沿。本文深入探讨了安卓和iOS这两大主流操作系统的未来走向,特别是它们在技术融合与创新方面的可能性。通过分析当前的市场需求、技术挑战和潜在的发展机会,我们将展望一个可能出现的未来场景:一个结合了安卓开放性和iOS优雅体验的双系统融合平台。这不仅仅是对技术极限的挑战,更是对用户体验极致追求的一次探索。
36 2