解决protobuf不能直接在IOS上使用的问题 https://www.cnblogs.com/jenke/p/4043828.html
https://www.cnblogs.com/jenke/p/4043828.html
protobuf-net.dll 在pc和android上可以直接使用,调用ProtoBuf.Serializer.Deserialize就能反序列化,但是在ios平台,在反射获取属性时,会找不到,从而导致运行失败。
解决办法:使用Precompile\precompile.exe,将protobuf生成的cs文件打包成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,然后反序列化结果,赋值给我们的消息类,然后我们就可以看到登录结果啦。