什么是Protobuf?
Protobuf(Protocal buffer)是google的一种数据交换的格式,基于二进制,跨语言、跨平台。html
在Unity中使用Protobuf
两种方式:
1.导入Unity专用的Protobuf-net资源包,用C#代码定义对象。
2.配置.net的Protobuf环境,用原生的.proto文件定义对象。json
这里测试选用的是第一次种方式。
protobuf-net.unitypackage 连接:https://pan.baidu.com/s/1DBD4... 提取码:trl4 segmentfault
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...测试
测试对象:优化
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; }
测试代码:ui
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性能要高很多,高数倍到十数倍。
Json和Protobuf该如何选择?
小孩子才作选择题,成年人固然是全都要。
我的建议:在对大小和性能不敏感时用JSON,敏感时用Protobuf。
好比本地写配置文件时用JSON,易读易修改。网络传输对象数据时用Protobuf,减少数据量。
参考资料:
《全方位评测:Protobuf性能到底有没有比JSON快5倍?》https://blog.csdn.net/xiaoxia...
闲聊:
在信息爆炸的时代,互联网技术日新月异,总会有各类各样的新技术、新工具出现,这是大势所趋,没法阻挡。
若是有哪天出现了比JSON更方便、比Protobuf更小的数据格式,我绝不意外,只会欣喜。
咱们要拥抱这种变化,对咱们来讲是好事,这些新技术、新工具的出现,让咱们的工做变得更方便、更效率、更强大了。
固然,这些新出现的技术和工具也须要咱们消耗更多的时间去了解、熟悉、精通。取其精华,去其糟粕便可。
从数据格式来说,从刚开始接触XML打开了新世界的大门,到见到JSON时的惊艳,再到知道Protobuf时的好奇。
发现这些数据格式都是为了完成某些特殊功能而实现的,适用环境不一样,各有优略,很难作到彻底替代,选择更适合的就好。
基本上分为两大类:
1.便于人使用
2.便于网络传输
第一种便于人使用的数据格式,趋向于更简洁的语法,可能是基于文本格式的,给人读的。
第二种便于网络传输的数据格式,趋向于更小的体积,给计算机读的。
第一种格式也许有哪一天会发展到成为全世界通用的语言,比如今的英语更容易理解,和学习阿拉伯数字0-9的难度相差不大,甚至能够做为儿童启蒙语言。
第二种格式会进化到彻底基于二进制bit来表示对象,数据极其紧凑,体积极小,基本无垃圾数据,没什么可压缩的空间。
PS:做者 ZhangYu 2019-07-25 看看人类须要多少年才能实现这两种格式。