我们接入了XLua,那么Protobuf极大的可能还是要用到的,如何接入进来的,这里简单介绍下。
我们可以在如下地址下载工程:
https://github.com/91Act/build_xlua_with_libs
可以在里面的LisTestProj中找到已经添加了的xlua.dll等库的文件,我们直接拷贝到我们工程中,替换我们原本的xlua.dll这些库,我们可以使用dll查看工具,可以看见此库中已经有一个luaopen_pb这个导出函数,我们需要使用一下。
我们找到XLua的C#工程,在LuaDLL的文件内添加如下2个导出函数的声明:
[DllImport(LUADLL, CallingConvention = CallingConvention.Cdecl)]
public static extern int luaopen_pb(IntPtr L);
[MonoPInvokeCallback(typeof(LuaDLL.lua_CSFunction))]
public static int LoadPb(IntPtr L)
{
return luaopen_pb(L);
}
然后在LueEvn.cs中调用一下:
AddBuildin("pb", LuaAPI.LoadPb); //添加这一行
AddBuildin("CS", StaticLuaCallbacks.LoadCS);
完成这一步,我们就能在我们的lua中间中使用了。
local pb = require "pb"
pb.option("enum_as_value")
Protobuf = {}
function Protobuf.Start()
CS.ResLoader.Get():LoadTextAsset("Assets/Art/Data/pb/person.pb.bytes",function(aa)
assert(pb.load(aa.bytes)) --把协load进来,下面就能直接使用
local msg = {}
msg.id = 1001
msg.name ="zhang san"
msg.email = "777777777@qq.com"
local bytes = assert(pb.encode("Person",msg))
print(pb.tohex(bytes))
local data2 = assert(pb.decode("Person", bytes))
print(require "serpent".block(data2))
end)
end
pb文件是.proto 通过protoc.exe工具生成的,protoc.exe 可以在下面链接下载
https://github.com/protocolbuffers/protobuf/releases
我这里改成了bytes后缀,是因为我要把pb文件导入assetBundle中。