-------------------------------------------------------------------------------------------------------------------------------------------------------------------

早前在公司突然要把项目移植到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上通讯的更多相关文章

  1. GitHub上最火的40个iOS开源项目

    1. AFNetworking 在众多iOS开源项目中,AFNetworking可以称得上是最受开发者欢迎的库项目.AFNetworking是一个轻量级的iOS. Mac OS X网络通信类库,现在是 ...

  2. GitHub上非常受开发者欢迎的iOS开源项目(二)

    "每一次的改变总意味着新的开始."这句话用在iOS上可谓是再合适不过的了.GitHub上的iOS开源项目数不胜数,iOS每一次的改变,总会引发iOS开源项目的演变,从iOS 1.x ...

  3. 如何解决 错误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' 大家在做真机调试的时候,或许会遇到这样的问题,那如何 ...

  4. 在MAC上搭建cordova3.4.0的IOS和android开发环境

    Hello,大家好,今天给大家说说在mac上搭建cordova3.4.0的iOS和Android开发环境,首先下载cordova,地址:https://cordova.apache.org/#down ...

  5. iOS开发——网络篇——NSURLSession,下载、上传代理方法,利用NSURLSession断点下载,AFN基本使用,网络检测,NSURLConnection补充

    一.NSURLConnection补充 前面提到的NSURLConnection有些知识点需要补充 NSURLConnectionDataDelegate的代理方法有一下几个 - (void)conn ...

  6. LocalResizeIMG前端HTML5本地压缩图片上传,兼容移动设备IOS,android

    LocalResizeIMG前端HTML5本地压缩图片上传,兼容移动设备IOS,android jincon 发表于 2015-02-26 18:31:01 发表在: php开发 localresiz ...

  7. Ext JS treegrid 发生的在tree上增加itemclick 与在其它列上增加actioncolumn 发生事件冲突(event conflict)的解决办法

    Ext JS treegrid 发生的在tree上增加itemclick 与在其它列上增加actioncolumn 发生事件冲突(event conflict)的解决办法 最近在适用Ext JS4开发 ...

  8. ios开发之网络数据的下载与上传

    要实现网络数据的下载与上传,主要有三种方式 > NSURLConnection  针对少量数据,使用“GET”或“POST”方法从服务器获取数据,使用“POST”方法向服务器传输数据; > ...

  9. ios常用的框架(源自知乎上的回答)

    首先,学习这类开源项目的主要目的是为了实现产品汪需求,如果不是这个目的,完全可以看Explore GitHub,当前最火的开源项目都在这里,当然你需要过滤一下语言. 好了,介绍几个希望能帮助到你. 普 ...

  10. iOS UIPrintInteractionController在iPad的 iOS10 和 11上的奇怪bug

    今天在弹出UIPrintInteractionController的时候,在ios10 和11的ipad 上测试,发现一直是protrait 方向弹出,结果就出现如下图的bug: 研究了好长时间,发现 ...

随机推荐

  1. 使用ajaxfileupload插件进行Ajax Post 异步提交多个文件

    前台代码: <div> <div> <img src="images/pro_upload.png" onclick="javascript ...

  2. 在object,embed上添加跳转链接(视频上添加跳转)

    今天遇到个问题,就是在视频上添加跳转链接时,谷歌浏览器能正常跳转,但是ie下,却无效,视频使用object引入,<a>标签跟随其后采用绝对定位,和平时的图片加跳转操作一样.原来是需要加上& ...

  3. mac命令学习记录

    1. 查找程序运行路径: which xxxx 2. 查找文件安装路径: whereis xxxx; 3. 编辑配置文件:vi ./.xxx : 进入需要编辑的文件: i  进行编辑  :输入:wq ...

  4. Java主函数定义

    public static void main(String[] args){} public: main主方法是由jvm来调用的,jvm实际也是一个程序,为了保证jvm能够在任何情况下来调用主函数. ...

  5. C++中的const和指针组合

    在C++里,const修饰指针有以下三种情况 (1)指针常量:即指向常量的指针 const  int *p或者int const *p const在*前,,可以这样理解它的功能,因为const在*前, ...

  6. linux 下mysql 开启远程连接

    系统通过netstat -ntlp  来查看正在运行服务所使用的端口 ,查看3306端口是否开启. 防火墙iptables 如果是新装的 系统, 一般不用管这个因素,不过我们也先 用service i ...

  7. Spring Framework的核心:IOC容器的实现

    2.1   Spring IoC容器概述 2.1.1 IoC容器和依赖反转模式 依赖反转的要义,如果合作对象的引用或依赖关系的管理由具体对象来完成,会导致代码的高度耦合和可测性的降低.依赖控制反转的实 ...

  8. oracle数据库表空间追加数据库文件方法

    oracle数据库表空间追加数据库文件方法   针对非大文件方式表空间,允许追加文件进行表空间的扩展,单个文件最大大小是32G  第一种方式:表空间增加数据文件    www.2cto.com   1 ...

  9. 列王的纷争,COK,675区,有去的没有?加群:159108918,盟的名字准备叫:大话西游

    首先我承认我玩物丧志了 679区,有去的没有?加群: 474574809,盟的名字叫:Moon Box 如何练最强5级号,为新区做准备?! 粮食是可以为0的,士兵不会死,这是关键之一. 关键之二是新手 ...

  10. isMobile

    var isMobile = { Android: function() { return navigator.userAgent.match(/Android/i); }, BlackBerry: ...