Protobuf
什么是Protobuf?
Protobuf(Protocal buffer)是google的一种数据交换的格式,基于二进制,跨语言、跨平台。
在Unity中使用Protobuf
两种方式:
1.导入Unity专用的Protobuf-net资源包,用C#代码定义对象。
2.配置.net的Protobuf环境,用原生的.proto文件定义对象。
这里测试选用的是第一次种方式。
protobuf-net.unitypackage 链接:
https://pan.baidu.com/s/1DBD4...
提取码:trl4
Protobuf解析代码封装:
using System.IO;
using ProtoBuf;
/// <summary>
/// Protobuf解析工具类
/// ZhangYu 2019-05-24
/// <para>blog:https://segmentfault.com/a/1190000019875130</para>
/// </summary>
public class PBParser {
/// <summary> 序列化 </summary>
public static byte[] To<T>(T entity) {
byte[] result = null;
if (entity != null) {
using (MemoryStream stream = new MemoryStream()) {
Serializer.Serialize<T>(stream, entity);
result = stream.ToArray();
return result;
/// <summary> 反序列化 </summary>
public static T From<T>(byte[] message) {
T result = default(T);
if (message != null) {
using (MemoryStream stream = new MemoryStream(message)) {
result = Serializer.Deserialize<T>(stream);
return result;
参考资料:
《Unity3D protobuf-net使用方式》https://www.cnblogs.com/mrblu...
《unity中使用protobuf-net》https://blog.csdn.net/kenkao/...
《Protobuf的使用流程》https://www.cnblogs.com/guxin...
什么是JSON?
JSON(JavaScript Object Notation,JS对象表示法)是一种轻量级的数据交换格式,基于文本,跨语言、跨平台。
JSON拥有简洁、易读写的特点。
一个简单的JSON:
"id":1,
"username":"zhangyu",
"password":"123456"
参考资料:
《JSON教程》https://segmentfault.com/a/11...
Protobuf和JSON对比
测试对象:
using ProtoBuf;
[ProtoContract]
public class TestVo {
[ProtoMember(1)]
public uint id;
[ProtoMember(2)]
public string username;
[ProtoMember(3)]
public string password;
[ProtoMember(4)]
public string nickname;
[ProtoMember(5)]
public byte lv;
[ProtoMember(6)]
public float hp;
[ProtoMember(7)]
public float mp;
[ProtoMember(8)]
public int exp;
测试代码:
private void TestVo() {
TestVo vo = new TestVo();
vo.id = 1000001;
vo.username = "zhangyu";
vo.password = "password";
vo.nickname = "冰封百度";
vo.lv = 100;
vo.hp = 99999f;
vo.mp = 88888f;
vo.exp = 9999999;
vo.isOnline = true;
// Json
string json = JsonUtility.ToJson(vo);
byte[] jsBytes = Encoding.UTF8.GetBytes(json);
print("Json:" + json);
print("Json bytes:" + BitConverter.ToString(jsBytes));
// Protobuf
byte[] pbBytes = PBParser.To(vo);
print("Protobuf bytes:" + BitConverter.ToString(pbBytes));
// Compare Length
print("Json length:" + jsBytes.Length);
print("Protobuf length:" + pbBytes.Length);
// 输出结果:
// Json:{"id":1000001,"username":"zhangyu","password":"password","nickname":"冰封百度","lv":100,"hp":99999.0,"mp":88888.0,"exp":9999999,"isOnline":true}
// Json bytes:7B-22-69-64-22-3A-31-30-30-30-30-30-31-2C-22-75-73-65-72-6E-61-6D-65-22-3A-22-7A-68-61-6E-67-79-75-22-2C-22-70-61-73-73-77-6F-72-64-22-3A-22-70-61-73-73-77-6F-72-64-22-2C-22-6E-69-63-6B-6E-61-6D-65-22-3A-22-E5-86-B0-E5-B0-81-E7-99-BE-E5-BA-A6-22-2C-22-6C-76-22-3A-31-30-30-2C-22-68-70-22-3A-39-39-39-39-39-2E-30-2C-22-6D-70-22-3A-38-38-38-38-38-2E-30-2C-22-65-78-70-22-3A-39-39-39-39-39-39-39-2C-22-69-73-4F-6E-6C-69-6E-65-22-3A-74-72-75-65-7D
// Protobuf bytes:08-C1-84-3D-12-07-7A-68-61-6E-67-79-75-1A-08-70-61-73-73-77-6F-72-64-22-0C-E5-86-B0-E5-B0-81-E7-99-BE-E5-BA-A6-28-64-35-80-4F-C3-47-3D-00-9C-AD-47-40-FF-AC-E2-04-48-01
// Json length:148
// Protobuf length:56
测试结果:
Protobuf比JSON小。
而从其他参考资料和测试结果来看:Protobuf比JSON速度快,体积小。JSON比Protobuf可读性强,易用性强。
结果分析:
Protobuf是基于二进制的,JSON是基于文本格式的,原理上决定了Protobuf速度会更快,体积会更小。
但是JSON毕竟发展很久了,用的更广泛,使用项目众多,类库众多,有些库经过深度优化,速度非常快了。在某些细节点上,性能不输于Protobuf,甚至更好。
用某几个高度优化的细节去对比JSON和Protobuf的性能,有些不客观,整体上来说,Protobuf比JSON性能要高不少,高数倍到十数倍。