赞
踩
Protocol Buffers是Google的一种数据交换的格式,一种轻量&高效的结构化数据存储格式。可以用于结构化数据串行化(序列化)。由于它是二进制的格式,比使用xml,Json进行数据交换快很多。
查看原理请打开: https://blog.csdn.net/carson_ho/article/details/70568606
下载编译后的 Protobuf: https://code.google.com/archive/p/protobuf-net/downloads(打开此网站需要开启 VPN,本人用的是风速SSR)
本人下载的是 protobuf-net r668.zip
也可以到我的百度网盘下载 protobuf-net r668.zip
链接:https://pan.baidu.com/s/1abf2xppxg9sQuyFxRlHAXA
密码:qfpx
下载后解压得到以下文件:
1.创建 login.proto 文件
2. 打开 login.proto 文件 并编写以下内容
- message PlayerInfo
- {
- optional string name = 1;
- optional string sex = 2;
- }
-
- message LoginInfo
- {
- optional PlayerInfo playerInfo = 1;
- required uint32 userId = 2;
- }
说明一下修饰符的意义
Required:必须字段,发送方必须赋该字段的值,对接收方,必须识别该字段的值
Optional:可选字段,可不赋值
Repeated:包含0-N个元素,一般为 list 或者 数组
1. 把从在 第一步 解压出来的 protobuf-net r668.zip 文件中 复制 Precompile 和 ProtoGen 文件夹 拷贝到 login.proto 同目录下
2. 在 login.proto 同目录 创建 ProtoTools.bat 文件 并 打开编写如下命令
- @echo off
- set tool=ProtoGen
-
- set proto=login.proto
-
- %tool%\protogen.exe -i:%proto% -o:%proto%.cs -ns:MyProto
-
- pause
3. 双击 ProtoTools.bat 然后 按Enter键 就生成了 login.proto.cs 文件(如果出现了错误 就检查一下 批处理命令 字段 是否正确)
1. 把从 第一步 解压出来的 protobuf-net r668.zip 文件中 Full / unity 文件夹拷贝到 login.proto 同目录下
2. 打开 ProtoTools.bat 文件 添加 生成 dll 命令,添加后的命令 如下
- @echo off
- set tool=ProtoGen
-
- SET BASE_DIR=%CD%
- SET PROTO_PER_COMPILE_BIN=\Precompile\precompile.exe
- SET DLL_NAME=ProtoCoreData.dll
- SET DOT_NET_VER=v2.0.50727
- SET CSC_MAKE=C:\Windows\Microsoft.NET\Framework\%DOT_NET_VER%\csc.exe
-
- set proto=login.proto
- %tool%\protogen.exe -i:%proto% -o:%proto%.cs -ns:MyProto
-
- %CSC_MAKE% /r:%BASE_DIR%\unity\protobuf-net.dll /out:%DLL_NAME% /target:library *.cs
- %BASE_DIR%%PROTO_PER_COMPILE_BIN% %DLL_NAME% -o:Serialzer_%DLL_NAME% -p:%BASE_DIR%\unity\ -t:ProtobufSerializer
-
- pause
3. 双击 ProtoTools.bat 文件 按 Enter 键 生成 ProtoCoreData.dll 和 Serialzer_ProtoCoreData.dll 文件(如果出现了错误 对比一下 上面bat文件中的 SET DOT_NET_VER=v2.0.50727 的版本号是否是 v2.0.50727,若不同就输入 cmd窗口上显示的版本号)
1. 把生成出来的 ProtoCoreData.dll 和 Serialzer_ProtoCoreData.dll 文件 拷贝到 Unity工程 Assets/Plugins/protobuf 目录下
2. 把在 login.proto 同目录下的 unity文件夹 里面 找到 protobuf-net.dll 文件 然后拷贝到 Unity工程 Assets/Plugins/protobuf 目录下
3. 创建CS代码 并 运行
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
-
- public class TestProto : MonoBehaviour {
-
- ProtobufSerializer serializer = new ProtobufSerializer();
-
- // Use this for initialization
- void Start () {
-
- MyProto.LoginInfo req = new MyProto.LoginInfo();
-
- MyProto.PlayerInfo playerInfo = new MyProto.PlayerInfo();
- playerInfo.name = "哈哈";
- req.playerInfo = playerInfo;
-
- //此 二进制串用于 与 服务器交互
- byte[] data = SerializeProto(req);
-
- //用于 读取 服务器发过来的数据
- MyProto.LoginInfo proto = DeSerializeProto(data, typeof(MyProto.LoginInfo)) as MyProto.LoginInfo;
- Debug.Log(proto.playerInfo.name);
- }
-
- //序列化
- byte[] SerializeProto(ProtoBuf.IExtensible proto)
- {
- byte[] data = null;
-
- using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
- {
- serializer.Serialize(ms, proto);
- if (ms.Length > 0)
- {
- data = new byte[(int)ms.Length];
- ms.Seek(0, System.IO.SeekOrigin.Begin);
- ms.Read(data, 0, data.Length);
- }
- ms.Close();
- }
- return data;
- }
-
- //反序列化
- ProtoBuf.IExtensible DeSerializeProto(byte[] data, Type type)
- {
- ProtoBuf.IExtensible proto = null;
- using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
- {
- ms.Write(data, 0, data.Length);
- ms.Seek(0, System.IO.SeekOrigin.Begin);
- proto = serializer.Deserialize(ms, null, type) as ProtoBuf.IExtensible;
- ms.Close();
- }
- return proto;
- }
-
- // Update is called once per frame
- void Update () {
-
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。