使用ProtoBuf-net进行数据的序列化和反序列化
2017-11-09 本文已影响1319人
_凉笙
protobuf是google的一个开源项目,可用于以下两种用途:
(1)数据的存储(序列化和反序列化),类似于xml、json等;
(2)制作网络通信协议。
protobuf比XML、比JSON更为强悍,语言无关、平台无关、更小的存储、更少的歧义、更高的性能
源码下载网站https://github.com/mgravell/protobuf-net
打包好的dll文件下载:https://code.google.com/archive/p/protobuf-net/downloads
我这里直接下载打包好的,直接把里面的dll导入到Unity3D里面操作就行。首先下载好后,直接在protobuf-net r668\Full\unity里面可以找到protobuf-net.dll,直接导入到unity 里面的Plugins文件里面就可以使用了。
在这里我以序列化和反序列化一段简单的信息为例。
首先我先创建一个脚本User
using ProtoBuf;
[ProtoContract]//表示这个类要作为ProtoBuf数据格式来进行传输
public class User {
[ProtoMember(1)]//标识
public int ID { get; set; }
[ProtoMember(2)]//标识
public string Username { get; set; }
[ProtoMember(3)]//标识
public string Password { get; set; }
[ProtoMember(4)]//标识
public int Level { get; set; }
[ProtoMember(5)]//标识
public UserType _UserType { get; set; }
//角色类型
public enum UserType
{
Master,
Warrior
}
}
然后创建脚本TestProtobuf去序列化User里面的信息并将生成一个bin文件.我在这里直接把文件保存到本地。
using UnityEngine;
using System.IO;
using ProtoBuf;
public class TestProtobuf : MonoBehaviour {
void Start () {
serialization();
}
//序列化User里面的信息内容
void serialization()
{
User user = new User();
user.ID = 100;
user.Username = "Lin";
user.Password = "123";
user.Level = 100;
user._UserType = User.UserType.Master;
using (var fs = File.Create(Application.dataPath + "/user.bin"))//文件输出流
{
Serializer.Serialize<User>(fs, user);//把user对象序列化出二进制文件放入fs文件里面
}
}
}
把脚本TestProtobuf挂载在摄像机上,然后运行,就可以看到我们的User信息被序列化成了bin文件保存到了本地里面
image.png
下面我们就开始反序列化进行解析这个bin文件,并将里面的数据输出来。还是在脚本TestProtobuf里面写入代码,代码如下
using UnityEngine;
using System.IO;
using ProtoBuf;
public class TestProtobuf : MonoBehaviour {
void Start () {
Notserialization();
//serialization();
}
//序列化User里面的信息内容
void serialization()
{
User user = new User();
user.ID = 100;
user.Username = "Lin";
user.Password = "123";
user.Level = 100;
user._UserType = User.UserType.Master;
using (var fs = File.Create(Application.dataPath + "/user.bin"))//文件输出流
{
Serializer.Serialize<User>(fs, user);//把user对象序列化出二进制文件放入fs文件里面
}
}
void Notserialization()
{
User user = null;
using (var fs = File.OpenRead(Application.dataPath + "/user.bin"))
{
user=Serializer.Deserialize<User>(fs);//反序列化
}
print("id:"+user.ID+",用户名:"+user.Username+",密码:"+user.Password+",等级:"+user.Level+",角色类型:"+user._UserType);
}
}
运行后就可看到输出结果,就是user.bin文件反序列化出来的角色信息
image.png
这样我们利用ProtoBuf-net进行序列号与反序列化的过程就完成了。
更多资料学习:
https://www.cnblogs.com/wu-jian/archive/2011/02/22/1961104.html