unityUnity3D 成神之路

使用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

image.png

我这里直接下载打包好的,直接把里面的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

http://blog.csdn.net/kun1234567/article/details/49758675

上一篇下一篇

猜你喜欢

热点阅读