ulua-pblua

protobuf-lua版本(pblua)

google官方并没有protobuf 的 Lua版本,然后网易的大神开发出了 protoc-gen-lua ,可以让我们将 .proto 文件转成 lua 脚本在 Lua中使用。ulua在很早的版本中就已经支持它了。

pblua使用的是将protobuf协议文件编码成lua文件,然后在lua程序中require进来,赋值,序列化,发送。我用的2.4.1版本比较老,可以下载最新版自己去编译,如果为了测试可以去ulua.org去下载测试。http://www.ulua.org/download.html

下载地址为:

protobuf-2.4.1.zip (d:/protobuf-2.4.1)
protoc-gen-lua.zip (d:/protoc-gen-lua)

请按照给定的路径放置,然后启动一个命令行到D:\protobuf-2.4.1\python 目录下,(确保已安装python 2.7.3,并且bin目录添加到环境变量path中)输入下面命令:

python setup.py build
python setup.py install

编译

修改uLua/Editor/Packager.cs里面BuildProtobufFile函数,即可以编译。

[MenuItem("LuaFramework/Build Protobuf-lua-gen File")]
    public static void BuildProtobufFile() {
        string dir = AppDataPath + "/LuaFramework/Lua/3rd/pblua";
        paths.Clear(); files.Clear(); Recursive(dir);

        string protoc = "d:/protobuf-2.4.1/src/protoc.exe";
        string protoc_gen_dir = "\"d:/protoc-gen-lua/plugin/protoc-gen-lua.bat\"";

        foreach (string f in files) {
            string name = Path.GetFileName(f);
            string ext = Path.GetExtension(f);
            if (!ext.Equals(".proto")) continue;

            ProcessStartInfo info = new ProcessStartInfo();
            info.FileName = protoc;
            info.Arguments = " --lua_out=./ --plugin=protoc-gen-lua=" + protoc_gen_dir + " " + name;
            info.WindowStyle = ProcessWindowStyle.Hidden;
            info.UseShellExecute = true;
            info.WorkingDirectory = dir;
            info.ErrorDialog = true;
            Util.Log(info.FileName + " " + info.Arguments);

            Process pro = Process.Start(info);
            pro.WaitForExit();
        }
        AssetDatabase.Refresh();
    }

测试发送pblua:

function PromptCtrl.TestSendPblua()
    local login = login_pb.LoginRequest();
    login.id = 2000;
    login.name = 'game';
    login.email = '[email protected]';
    local pbs= login:SerializeToString();
    ----------------------------------------------------------------
    local buffer = ByteBuffer.New();
    buffer:WriteByte(Protocal.Login);
    buffer:WriteBuffer(pbs);
    NetManager:SendMessage(buffer);
end

测试解析pblua:

function Network.TestLoginPblua(buffer)
    local protocal = buffer:ReadByte();
    local data = buffer:ReadBuffer();
    local pbs= login_pb.LoginResponse();
    pbs:ParseFromString(data);
    log('TestLoginPblua: protocal:>'..protocal..' pbs:>'..pbs.id);
end

你可能感兴趣的:(ulua-pblua)