解决protobuf不能直接在IOS上使用,利用protobuf-net在IOS上通讯
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
早前在公司突然要把项目移植到IOS上,但是protobuf却出现了不能使用的情况,后来在网上找到了解决方案,感谢那位大神。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
原文连接地址:http://game.ceeger.com/forum/read.php?tid=14359&fid=27&page=1
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
以下是笔者自己的使用记录,为了方便自己以后使用时再次查看,看不懂的笔者粗语的可以到原文中查看,不喜勿喷-----------~~~-------------~~!!!
首先是下载protobuf-net,当然我当时使用的也是r668版本,有没有什么新的我也没有去查。好了不废话,现在开始进入正题。
第一、
下载protobuf-net,解压到你想要的目录,按照原文中的意思要把两个Precompile\precompile.exe 以及 ProtoGen\protogen.exe 两个文件加入到环境变量中 , 之后方便使用。笔者第一次使用的时候设置了环境变量但是不知道为什么不管用,后来笔者将他写成了bat文件,只改文件名字和路径解决了一切。
cd C:\Users\Administrator\Desktop\Moblie\protobuf-net\ProtoGen
protogen -i:backstageMessagecontract.proto -o:BackstageMessagecontract.cs -ns:com.czkj.jsys
这就是笔者写的很挫的bat文件,为了加深记忆,笔者决定再写一次,一切为了伟大程序员使命。
经过笔者的再次尝试这次设置环境变量成功了,看来笔者以前肯定犯了什么错误。
这给不懂设置的人看的:http://wenku.baidu.com/link?url=y_hM5UZgCbs4uWPlIq7UPCT4QrwI5QahTo2tPmJRd6jgoQ5NqX6eGiswPnDbR4zhfGFbr3w9RBAhxyGO2DRdtEDtq_GEedPwQ28be5Bixvi
贴上成功的图片。
第二、proto文件书写规则
message MessageContract {
required string contractId = 1;
optional bytes body = 2;
required int64 date = 3;
}
message ReconnectionContract{
optional string sessonid= 1;
}
message ReconnectionResultContract{
required int32 result = 1;
}
message LoginContract{
required int32 versionCode = 1;
required string versionName = 2;
optional string userName = 3;
optional string password = 4;
optional string touristCode = 5;
optional string openId = 6;
optional string TXWMId = 7;
optional string ip= 8;
}
message LoginResultContract{
required int32 result = 1;
optional string sessonid= 2;
optional string userName = 3;
}
这里解释一下我这个proto的实际用法,MessageContract 其实是作为一个消息总体,他把发送的消息打包到自己的body上,然后自身有一个连接类型辨别contractId ,至于data则是笔者用来记录某项东西用的,具体你们可以自己斟酌要不要。
这里举个栗子(希望大家喜欢)
比如说像笔者这样子的要做一个登录的连接,可以看到我们有LoginContract和LoginResultContract两个消息体(笔者是个菜鸟,不知道这样叫是否正确)。正如字面上的意思,一个是用来发送登录消息的一个是用来接收登录消息的。可能有的人又会问了,你说的这些我都知道,可是具体怎么用呢。
这里再举个栗子,结合我这个测试的项目
在我们完成整个打包之后(具体的可以看完下面的再倒回来看)。
我们生成文件之后,就可以使用我们刚刚的消息体了。废话不多说上图!
这里我们把这个消息对象实例化,然后给这个消息体赋值,再转化为byte[],再以同样的方式赋值到总消息体上,最后发送出去,具体怎么转化,下面讲到的时候在细说。对了,这里可能有的人会问,为什么你写的是LoginContract出来的却不一样,这里的原因是在你打包的时候,他会把你的消息类重命名成这种类型,也就是说你后面写的消息体也是会按这种结构类型出来(不知道笔者理解有没有错或者写错什么,欢迎指出,感谢万分)。
第三、生成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文件中),这样之后之后操作比较方便一些。
cd C:\Users\Administrator\Desktop\Moblie\protobuf-net\ProtoGen
protogen -i:backstageMessagecontract.proto -o:BackstageMessagecontract.cs -ns:com.czkj.jsys
这是笔者写的一个bat文件内容,在你的目录里面生成cs文件,笔者这里把文件都丢那里去了,大家可根据喜好自己修改文件路径。后面的-ns是命名空间,请自行定义。
第四、编译dll库(可以直接查看原文)
使用MonoDevelop工具 将上一步生成的cs文件编译成dll库.
1.创建一个新的工程 (File->New->Solution)
2.在弹出的对话框中选择 C# 再选择 Library.
3.在下方填写好工程的名字 (这个名字是生成dll的名字,所以要起好,笔者的是BackstageMessagecontract)
4.点击forward (之后还要点一次ok)
5.删掉默认生成的MyClass.cs文件,有必要的话在AssemblyInfo.cs里填写一些版权信息。
6.将上一步用protogen生成的cs文件 加入到工程 (在左边工程名 上右键 就可以添加)
7.添加protobuf-net引用库
点击工程的References->Edit References
然后选择刚才的CoreOnly\ios下的dll库 , 双击库文件就可以加到右边(这里值得一提的是里面包含有不同的平台选择)
(经过笔者的验证,要在安卓上使用的话可以选择mono)
最后检查下References里面如果有protobuf-net.dll就正确了。
8.都做好后, 点击Build->Build All就可以在当前工程生成dll了(dll的路径在你的项目的Debug或者Release文件夹里面)
不要忘记 debug 和 release的选择 ,测试完后应该重新拿release再编译一次的。
第五、预编译序列化库
上一步生成了数据的dll文件,这一步需要用到上一步的dll文件来生成专门序列化的dll文件。
( 上一步生成的dll文件目录,会自动把protobuf-net库文件也复制过来 , 所以只需要记住这一点就行了。 比如你要是复制到其他目录进行操作, 这点会很重要 )
D:
cd D:\Documents\Projects\BackstageMessagecontract\BackstageMessagecontract\bin\Release
C:\Users\Administrator\Desktop\Moblie\protobuf-net\Precompile\Precompile BackstageMessagecontract.dll -o:ProtobufSerialize.dll -t:com.czkj.ProtobufSerializer
这是笔者的bat在对应路径里面生成我们想要的dll文件。当运行完之后你会发现三个dll都在一起了,然后把他们一起丢进到项目里面去吧。
笔者使用的是Unity,经过测试之后在Unity编译器中Xcode中和真机上都通过了运行。
最后、代码测试
1.如何序列化数据
这里消息进行了两次打包,最后才进行消息发送,至于怎么发送什么的都是大神提供的现成的接口,有机会的话再写上一帖,让自己也学习学习。
2.如何反序列化
笔者这里是使用了大神提供的消息机制,进行消息回调。当服务器返回消息的时候会执行这里的abc,然后反序列化结果,赋值给我们的消息类,然后我们就可以看到登录结果啦。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------笔者第一次写博客,感觉写得真心累呀,程序员真是一个不简单的生物---------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------------------------
解决protobuf不能直接在IOS上使用,利用protobuf-net在IOS上通讯的更多相关文章
- GitHub上最火的40个iOS开源项目
1. AFNetworking 在众多iOS开源项目中,AFNetworking可以称得上是最受开发者欢迎的库项目.AFNetworking是一个轻量级的iOS. Mac OS X网络通信类库,现在是 ...
- GitHub上非常受开发者欢迎的iOS开源项目(二)
"每一次的改变总意味着新的开始."这句话用在iOS上可谓是再合适不过的了.GitHub上的iOS开源项目数不胜数,iOS每一次的改变,总会引发iOS开源项目的演变,从iOS 1.x ...
- 如何解决 错误code signing is required for product type 'xxxxx' in SDK 'iOS 8.2'
如何解决 错误code signing is required for product type 'xxxxx' in SDK 'iOS 8.2' 大家在做真机调试的时候,或许会遇到这样的问题,那如何 ...
- 在MAC上搭建cordova3.4.0的IOS和android开发环境
Hello,大家好,今天给大家说说在mac上搭建cordova3.4.0的iOS和Android开发环境,首先下载cordova,地址:https://cordova.apache.org/#down ...
- iOS开发——网络篇——NSURLSession,下载、上传代理方法,利用NSURLSession断点下载,AFN基本使用,网络检测,NSURLConnection补充
一.NSURLConnection补充 前面提到的NSURLConnection有些知识点需要补充 NSURLConnectionDataDelegate的代理方法有一下几个 - (void)conn ...
- LocalResizeIMG前端HTML5本地压缩图片上传,兼容移动设备IOS,android
LocalResizeIMG前端HTML5本地压缩图片上传,兼容移动设备IOS,android jincon 发表于 2015-02-26 18:31:01 发表在: php开发 localresiz ...
- Ext JS treegrid 发生的在tree上增加itemclick 与在其它列上增加actioncolumn 发生事件冲突(event conflict)的解决办法
Ext JS treegrid 发生的在tree上增加itemclick 与在其它列上增加actioncolumn 发生事件冲突(event conflict)的解决办法 最近在适用Ext JS4开发 ...
- ios开发之网络数据的下载与上传
要实现网络数据的下载与上传,主要有三种方式 > NSURLConnection 针对少量数据,使用“GET”或“POST”方法从服务器获取数据,使用“POST”方法向服务器传输数据; > ...
- ios常用的框架(源自知乎上的回答)
首先,学习这类开源项目的主要目的是为了实现产品汪需求,如果不是这个目的,完全可以看Explore GitHub,当前最火的开源项目都在这里,当然你需要过滤一下语言. 好了,介绍几个希望能帮助到你. 普 ...
- iOS UIPrintInteractionController在iPad的 iOS10 和 11上的奇怪bug
今天在弹出UIPrintInteractionController的时候,在ios10 和11的ipad 上测试,发现一直是protrait 方向弹出,结果就出现如下图的bug: 研究了好长时间,发现 ...
随机推荐
- 使用ajaxfileupload插件进行Ajax Post 异步提交多个文件
前台代码: <div> <div> <img src="images/pro_upload.png" onclick="javascript ...
- 在object,embed上添加跳转链接(视频上添加跳转)
今天遇到个问题,就是在视频上添加跳转链接时,谷歌浏览器能正常跳转,但是ie下,却无效,视频使用object引入,<a>标签跟随其后采用绝对定位,和平时的图片加跳转操作一样.原来是需要加上& ...
- mac命令学习记录
1. 查找程序运行路径: which xxxx 2. 查找文件安装路径: whereis xxxx; 3. 编辑配置文件:vi ./.xxx : 进入需要编辑的文件: i 进行编辑 :输入:wq ...
- Java主函数定义
public static void main(String[] args){} public: main主方法是由jvm来调用的,jvm实际也是一个程序,为了保证jvm能够在任何情况下来调用主函数. ...
- C++中的const和指针组合
在C++里,const修饰指针有以下三种情况 (1)指针常量:即指向常量的指针 const int *p或者int const *p const在*前,,可以这样理解它的功能,因为const在*前, ...
- linux 下mysql 开启远程连接
系统通过netstat -ntlp 来查看正在运行服务所使用的端口 ,查看3306端口是否开启. 防火墙iptables 如果是新装的 系统, 一般不用管这个因素,不过我们也先 用service i ...
- Spring Framework的核心:IOC容器的实现
2.1 Spring IoC容器概述 2.1.1 IoC容器和依赖反转模式 依赖反转的要义,如果合作对象的引用或依赖关系的管理由具体对象来完成,会导致代码的高度耦合和可测性的降低.依赖控制反转的实 ...
- oracle数据库表空间追加数据库文件方法
oracle数据库表空间追加数据库文件方法 针对非大文件方式表空间,允许追加文件进行表空间的扩展,单个文件最大大小是32G 第一种方式:表空间增加数据文件 www.2cto.com 1 ...
- 列王的纷争,COK,675区,有去的没有?加群:159108918,盟的名字准备叫:大话西游
首先我承认我玩物丧志了 679区,有去的没有?加群: 474574809,盟的名字叫:Moon Box 如何练最强5级号,为新区做准备?! 粮食是可以为0的,士兵不会死,这是关键之一. 关键之二是新手 ...
- isMobile
var isMobile = { Android: function() { return navigator.userAgent.match(/Android/i); }, BlackBerry: ...