Unity3D 中 protobuf-net

来源:互联网 发布:js教程 编辑:程序博客网 时间:2024/04/29 06:19

本节主要写一下在unity中是怎样用protobuf-net 来序列化和反序列化数据的

我上传了protobuf-net 地址

http://download.csdn.net/detail/jk823394954/9026241

也可以从http://code.google.com/p/protobuf/ 下载最新的protobuf-net


protobuf-net下载后的目录如下图


进入ProtoGen 中建一个记事本叫做Role.proto的文件,记住把记事本的后缀改成.proto

Role.proto中的内容如下

// 技能信息message VO_Skill{required int32 skillGroupId = 1; // 技能idrequired int32 level = 2; // 技能等级}// 玩家信息消息message CS_RoleInfo{required int32 playerId = 1; // 角色idrepeated VO_Skill skills = 2; // 技能组}

其中字段message 你可以理解成c#中的类class ,VO_Skill 和 CS_RoleInfo均为类名

字段 required标示该字段是必须的,既实例化该类时必须对该字段赋值

字段 repeated标示该字段是可以重复的,repeated VO_Skill skills 你可以理解成 List<VO_Skill>VO_Skill skills 


下一步是把Role.proto文件转化成.cs文件

打开cmd命令行 进入 ProtoGen这个目录下我的是放在桌面了,所以如下图


然后按下面的格式输入内容

protogen -i:Test1.proto -i:Test2.proto -i:Test3.proto -o:Output.cs -ns:com.fbmly.model

-i 是输入文件,可以有多个

-o 输出的cs文件, 只能有一个..如果-i有多个 会将所有的代码生成到这一个cs文件当中

-ns 命名空间   最好使用,如果不使用每次生成的默认命名空间是proto的文件名。

比如 我输入的是

protogen -i:Role.proto -o:Output.cs -ns:com.yyq.model



按下回车键 我们就发现在ProtoGen这个目录下多了一个Output.cs的文件


下面就是把Output.cs文件生成dll

打开unity3d自带的编译器MonoDevelop,创建c#的 Library工程 如下图


 

删除系统生成的MyClass.cs文件,把刚才生成的Output.cs文件加载进来



下面引入protobuf-net.dll库

在References右键 选择 Edit References如下图



选择.Net Assembly 找到CpreOnly/ios 目录 会看到 有一个 protobuf-net.dll库 ,双击它 在右面看到有这个就可以了,然后点击Ok



然后选择Build-->Build All ,会看到窗口中显示Build successful 就是成功了、




因为我的工程叫做Protobuf-NetTest 所以这时会在工程下看到有一个Protobuf-NetTest.dll



这个裤中有咱们的数据结构 既 VO_Skill 和 CS_RoleInfo类


下面就是把这个Protobuf-NetTest.dll 生成专门序列化的库

预编译要使用到的库为precompile.dll 在Precompile目录下

因为我的Protobuf-NetTest.dll是生成在 bin\Release目录下的,所以在刚才的工程的bin\Release目录下建造一个批处理文件project.bat

project.bat中的内容如下

C:\Users\jk\Desktop\proto_net\Precompile\precompile Protobuf-NetTest.dll -o:ProtobufSerializer.dll -t:com.yyq.model.ProtoSerializer 

其中 Protobuf-NetTest.dll 是上一步生成的dll的名字,ProtobufSerializer.dll是将要生成的序列化的库名字,com.yyq.model.ProtobufSerializer是命名空间


双击project.bat即可看到多了一个ProtobufSerializer.dll库文件,该库就是序列化的库


在unity3d中使用


我们在unity的Assets下建个名字叫ProtoBuf的文件夹,把上一步生成的Protobuf-NetTest.dll ,ProtobufSerializer.dl 和 protobuf-net.dll复制到该文件夹下


我们在unity的Assets下建个名字叫Scripts的文件夹,建一个叫做ProtoTest.cs的文件


文件引用部分如下

using UnityEngine;using System.Collections;using System.Collections.Generic;using System.IO;using com.yyq.model;


其中using com.yyq.model; 是我们自己的命名空间


全局变量的声明 和初始化 如下

    public static ProtoSerializer serializer;    List<VO_Skill> sList = new List<VO_Skill>();    MemoryStream ms = new MemoryStream();    void Start () {        serializer = new ProtoSerializer();    }


然后写两个函数 序列化的函数 Serialize() 和 反序列化的函数 Deserialize()


序列化的函数 Serialize()

public void Serialize() {        VO_Skill s1 = new VO_Skill();        s1.skillGroupId = 1;        s1.level = 2;        VO_Skill s2 = new VO_Skill();        s2.skillGroupId = 3;        s2.level = 4;                sList.Add(s1);        sList.Add(s2);        CS_RoleInfo roleInfo = new CS_RoleInfo();        roleInfo.playerId = 888;        roleInfo.skills.AddRange(sList);                serializer.Serialize(ms, roleInfo);     }


反序列化的函数 Deserialize()


public void Deserialize()    {        CS_RoleInfo roleInfo = new CS_RoleInfo();        ms.Position = 0;        object roleInfoObj = serializer.Deserialize(ms, null, typeof(CS_RoleInfo));        roleInfo = roleInfoObj as CS_RoleInfo;                Debug.Log("roleInfo.playerId " + roleInfo.playerId);        foreach (VO_Skill skill in roleInfo.skills) {            Debug.Log("skill.skillGroupId " + skill.skillGroupId + " skill.level " + skill.level);        }    }


我们在unity场景中放两个按钮,名字分别叫做 Serialize 和 Deserialize,其中按钮Serialize的点击事件 调用函数 Serialize(),按钮Deserialize的点击事件调用函数 Deserialize()



我们先点击Serialize 按钮,再点击Deserialize 按钮,则在控制台会看到输出



这正是我们所需要的数据




0 0