FlatBuffers library for Lua.
Need submodule:
$ git submodule update --init
Use premake5 to generate VS solution and linux Makefile, see here.
Vs2015 sln and Makefile are provided.
By default, it expects the Lua library to build under C++.
If you really want to use Lua library compiled under C,
you can define LUAINTF_LINK_LUA_COMPILED_IN_CXX
to 0 in build/premake5.lua.
See: https://github.com/SteveKChiu/lua-intf
defines { "LUAINTF_LINK_LUA_COMPILED_IN_CXX=0" }
- For Linux, copy
liblua.a
tothird_party/lib/
. - For Windows, copy
lua.lib
debug and release tothird_party/lib/Debug
andRelease
dir.
- For Linux, build and install
flatbuffers
. Or copylib
tothird_party/lib/
. - For Windows, copy
flatbuffers.lib
debug and release tothird_party/lib/Debug
andRelease dir
.
flatc --binary --schema monster.fbs
local lfb = require("lfb")
-- Load a FlatBuffers schema file.
assert(lfb.load_bfbs_file("monster.bfbs"))
local monster = {
pos = {
x = 1,
y = 2,
z = 3,
},
hp = 300,
name = "Orc",
}
-- Build a buffer.
local buf = assert(lfb.encode("Monster", monster))
-- Decode a flatbuffers string back to a Lua table.
local monster2 = assert(lfb.decode("Monster", buf))
E:\Git\Lua\lua-flatbuffers_jinq0123\test>lua53pp.exe test.lua All test passed. E:\Git\Lua\lua-flatbuffers_jinq0123\test>
E:\Git\Lua\lua-flatbuffers_jinq0123\test>lua53pp.exe Lua 5.3.2 Copyright (C) 1994-2015 Lua.org, PUC-Rio > package.cpath = package.cpath .. ";../bin/Debug/?.dll" > lfb = require("lfb") > lfb.load_bfbs_file("../third_party/flatbuffers/tests/monster_test.bfbs") true > buf = assert(lfb.encode("Monster", {name="N", hp=1234})) > t = assert(lfb.decode("Monster", buf)) > inspect = require("inspect") > inspect(t) { color = 8, hp = 1234, mana = 150, name = "N", test_type = 0, testbool = false, testf = 3.1415901184082, testf2 = 3.0, testf3 = 0.0, testhashs32_fnv1 = 0, testhashs32_fnv1a = 0, testhashs64_fnv1 = 0, testhashs64_fnv1a = 0, testhashu32_fnv1 = 0, testhashu32_fnv1a = 0, testhashu64_fnv1 = 0, testhashu64_fnv1a = 0 } >
Number will be converted to string if necessary.
buf = assert(lfb.encode("Monster", {name=123}))
t = assert(lfb.decode("Monster", buf))
assert("123" == t.name)
Integer will be converted from one type to another. Such as from int 256 to byte 0:
buf = assert(lfb.encode("Test", {a=1, b=256})) -- Test.b is byte
t = assert(lfb.decode("Test", buf))
assert(1 == t.a and 0 == t.b)
String can be converted to integer or float:
buf = assert(lfb.encode("Test", {a=1, b="25"}))
t = assert(lfb.decode("Test", buf))
assert(1 == t.a and 25 == t.b)
buf = assert(lfb.encode("Monster", {name="", testf="1.2"}))
t = assert(lfb.decode("Monster", buf))
assert(math.type(t.testf) == "float")
assert(tostring(t.testf) == "1.2000000476837")
Can not convert float to integer.
buf, err = lfb.encode("Test", {a=1.2, b=2})
assert(err == "can not convert field Test.a(1.2) to integer")
Enum is integer, but input string enum will be converted to integer.
local name = "TestSimpleTableWithEnum"
buf = assert(lfb.encode(name, {color = 123}))
t = assert(lfb.decode(name, buf))
assert(123 == t.color)
buf = assert(lfb.encode(name, {color = "Blue"}))
t = assert(lfb.decode(name, buf))
assert(8 == t.color)
Array only read from index 1 to len, ignoring others.
buf = assert(lfb.encode("Monster", {name="", inventory={
1,2, [-1]=-1, [100]=100, x=101}}))
t = assert(lfb.decode("Monster", buf))
assert(2 == #t.inventory)
assert(nil == t.inventory[-1])
assert(nil == t.inventory[100])
- Support namespace. Reflection schema does not support namespaces #3899.
- Sort key.
- Verify key order.
- Add file_identifier if root_type.
- Load fbs file directly.
https://github.com/DavidFeng/lua-flatbuffers
Another FlatBuffers library for lua 5.3, which implemented the reading of FlatBuffers but writing is to be implemented.