美文网首页
在Unity3D中使用ProtoBuf

在Unity3D中使用ProtoBuf

作者: qufl | 来源:发表于2018-01-18 00:30 被阅读2090次

    关键词:

    1. Unity3D
    2. ProtoBuf
    3. 序列化

    开发环境:

    1. 引擎版本: Unity3D 5.4.1f1 Personal

    简述

    前段时间在看一个unity3d教程,在教程项目中用到了ProtoBuf,然后我在编写完代码之后运行时报错了,检测若干遍代码逻辑,最后发现是忘了写[ProtoContract],所以记录一下使用方法和问题。


    简单使用方法

    将ProtoBuf倒入到项目中

    一般来说,有两种方式可以将ProtoBuf倒入到自己的项目中:

    1. 从Github下载ProtoBuf的源码放入自己的工程。
    2. 将编译好的dll库放入自己的工程。

    这里我从网上下载了一个protobuf-net.dll文件,直接放到了我的unity3d项目下。

    u3d项目下的protobuf-net.dll

    一个使用ProtoBuf的示例

    using System;
    //需要用到MemoryStream
    using System.IO;
    
    using UnityEngine;
    //引入ProtoBuf命名空间
    using ProtoBuf;
    
    /// <summary>
    /// 测试类
    /// </summary>
    public class TestProtobuf : MonoBehaviour {
    
        /// <summary>
        /// 用于测试的数据类
        /// </summary>
        [ProtoContract]  //声明这个类能被序列化
        public class UserData
        {
            //声明每一个需要被序列化的成员,编号从1开始
            [ProtoMember(1)]
            public int id;
    
            [ProtoMember(2)]
            public string name;
    
            [ProtoMember(3)]
            public int level;
        }
    
        //测试代码
        void Start()
        {   
            //将要被序列化的UserData示例
            UserData user1 = new UserData ();
            user1.id = 1;
            user1.name = "User1";
            user1.level = 10;
            //打印user1
            Debug.Log (string.Format ("user1-> id:{0}, name:{1}, level:{2}", user1.id, user1.name, user1.level));
    
            //序列化
            byte[] buff = null;
            using (MemoryStream ms = new MemoryStream ()) {
                
                Serializer.Serialize<UserData> (ms, user1);
                ms.Position = 0;
    
                int length = (int)ms.Length;
                buff = new byte[length];
                ms.Read (buff, 0, length);
            }
    
            //输出字节数组
            Debug.Log (string.Format("Serialized data-> {0}", BitConverter.ToString(buff)));
    
            //反序列化
            UserData user2 = default(UserData);
            using (MemoryStream ms = new MemoryStream (buff)) {
                user2 = Serializer.Deserialize<UserData> (ms);
            }
            //打印反序列化生成的user2
            Debug.Log (string.Format ("user2-> id:{0}, name:{1}, level:{2}", user2.id, user2.name, user2.level));
        }
    }
    

    使用ProtoBuf对一个数据类进行序列化和反序列化的过程如上代码。

    我将这段代码保存为TestProtobuf.cs文件,并添加到我的Camera对象上,运行结果如图:

    运行结果

    总结

    对于ProtoBuf的用途已经有太多博客去进行描述,对于ProtoBuf我目前也没有特别的使用技巧,在此就不赘述了。

    以下补充以下需要注意的问题:

    1. 对需要序列化的类,两种声明([ProtoContract],[ProtoMember(编号)])一定要记得添加。如果未对类添加[ProtoContract]声明,在进行序列化时会报错,提示找不到对应的类。如果未对成员添加[ProtoMember(编号)]声明,则该成员不会被序列化,其他成员不受影响。如果[ProtoMember(编号)]声明的编号使用了0,运行时会报错参数超出范围,如果在一个类中使用了重复的编号,运行时会报错提示参数重复。
    2. 在实际项目中使用ProtoBuf时,尽量将序列化和反序列化的逻辑使用泛型封装起来。

    相关文章

      网友评论

          本文标题:在Unity3D中使用ProtoBuf

          本文链接:https://www.haomeiwen.com/subject/rbypoxtx.html