Protobuf介绍
Protocol Buffers是Google的一种数据交换的格式,一种轻量&高效的结构化数据存储格式。可以用于结构化数据串行化(序列化)。由于它是二进制的格式,比使用xml,Json进行数据交换快很多。
查看原理请打开: https://blog.csdn.net/carson_ho/article/details/70568606
Demo地址【Unity】:https://download.csdn.net/download/qq_30259857/10903325
下面开始讲解使用整个过程:
第一步: 下载
下载编译后的 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
下载后解压得到以下文件:
第二步: 编写Proto文件
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 或者 数组
第三步:生成CS
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 文件(如果出现了错误 就检查一下 批处理命令 字段 是否正确)
第四步: 生成dll文件
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窗口上显示的版本号)
第五步: 在Unity里使用Protobuf
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 () {
}
}