mirror of
https://github.com/gvx/bitser.git
synced 2024-11-24 06:54:20 +00:00
parent
3b8dae1dde
commit
3571bdb928
@ -47,5 +47,5 @@ send me a pull request!
|
|||||||
|
|
||||||
## You can register classes?
|
## You can register classes?
|
||||||
|
|
||||||
Yes. At the moment, bitser supports MiddleClass, SECL, hump.class and Slither (and
|
Yes. At the moment, bitser supports MiddleClass, SECL, hump.class, Slither and Moonscript classes (and
|
||||||
probably some other class libraries by accident).
|
probably some other class libraries by accident).
|
||||||
|
14
bitser.lua
14
bitser.lua
@ -176,7 +176,8 @@ local function write_table(value, seen)
|
|||||||
local classname = (class_name_registry[value.class] -- MiddleClass
|
local classname = (class_name_registry[value.class] -- MiddleClass
|
||||||
or class_name_registry[value.__baseclass] -- SECL
|
or class_name_registry[value.__baseclass] -- SECL
|
||||||
or class_name_registry[getmetatable(value)] -- hump.class
|
or class_name_registry[getmetatable(value)] -- hump.class
|
||||||
or class_name_registry[value.__class__]) -- Slither
|
or class_name_registry[value.__class__] -- Slither
|
||||||
|
or class_name_registry[value.__class]) -- Moonscript class
|
||||||
if classname then
|
if classname then
|
||||||
classkey = classkey_registry[classname]
|
classkey = classkey_registry[classname]
|
||||||
Buffer_write_byte(242)
|
Buffer_write_byte(242)
|
||||||
@ -354,6 +355,10 @@ local function deserialize_Slither(instance, class)
|
|||||||
return getmetatable(class).allocate(instance)
|
return getmetatable(class).allocate(instance)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function deserialize_Moonscript(instance, class)
|
||||||
|
return setmetatable(instance, class.__base)
|
||||||
|
end
|
||||||
|
|
||||||
return {dumps = function(value)
|
return {dumps = function(value)
|
||||||
serialize(value)
|
serialize(value)
|
||||||
return ffi.string(buf, buf_pos)
|
return ffi.string(buf, buf_pos)
|
||||||
@ -381,7 +386,7 @@ end, unregister = function(name)
|
|||||||
end, registerClass = function(name, class, classkey, deserializer)
|
end, registerClass = function(name, class, classkey, deserializer)
|
||||||
if not class then
|
if not class then
|
||||||
class = name
|
class = name
|
||||||
name = class.__name__ or class.name
|
name = class.__name__ or class.name or class.__name
|
||||||
end
|
end
|
||||||
if not classkey then
|
if not classkey then
|
||||||
if class.__instanceDict then
|
if class.__instanceDict then
|
||||||
@ -391,7 +396,7 @@ end, registerClass = function(name, class, classkey, deserializer)
|
|||||||
-- assume SECL
|
-- assume SECL
|
||||||
classkey = '__baseclass'
|
classkey = '__baseclass'
|
||||||
end
|
end
|
||||||
-- assume hump.class, Slither, or something else that doesn't store the
|
-- assume hump.class, Slither, Moonscript class or something else that doesn't store the
|
||||||
-- class directly on the instance
|
-- class directly on the instance
|
||||||
end
|
end
|
||||||
if not deserializer then
|
if not deserializer then
|
||||||
@ -407,6 +412,9 @@ end, registerClass = function(name, class, classkey, deserializer)
|
|||||||
elseif class.__name__ then
|
elseif class.__name__ then
|
||||||
-- assume Slither
|
-- assume Slither
|
||||||
deserializer = deserialize_Slither
|
deserializer = deserialize_Slither
|
||||||
|
elseif class.__base then
|
||||||
|
-- assume Moonscript class
|
||||||
|
deserializer = deserialize_Moonscript
|
||||||
else
|
else
|
||||||
error("no deserializer given for unsupported class library")
|
error("no deserializer given for unsupported class library")
|
||||||
end
|
end
|
||||||
|
@ -163,6 +163,37 @@ describe("bitser", function()
|
|||||||
assert.is_true(class.isinstance(serdeser(bojack), Horse))
|
assert.is_true(class.isinstance(serdeser(bojack), Horse))
|
||||||
bitser.unregisterClass('Horse')
|
bitser.unregisterClass('Horse')
|
||||||
end)
|
end)
|
||||||
|
it("serializes Moonscript class instances", function()
|
||||||
|
local Horse
|
||||||
|
do
|
||||||
|
local _class_0
|
||||||
|
local _base_0 = {}
|
||||||
|
_base_0.__index = _base_0
|
||||||
|
_class_0 = setmetatable({
|
||||||
|
__init = function(self, name)
|
||||||
|
self.name = name
|
||||||
|
self[1] = 'instance can be sequence'
|
||||||
|
end,
|
||||||
|
__base = _base_0,
|
||||||
|
__name = "Horse"}, {
|
||||||
|
__index = _base_0,
|
||||||
|
__call = function(cls, ...)
|
||||||
|
local _self_0 = setmetatable({}, _base_0)
|
||||||
|
cls.__init(_self_0, ...)
|
||||||
|
return _self_0
|
||||||
|
end
|
||||||
|
})
|
||||||
|
_base_0.__class = _class_0
|
||||||
|
Horse = _class_0
|
||||||
|
end
|
||||||
|
assert.are.same(Horse.__name, "Horse") -- to shut coveralls up
|
||||||
|
bitser.registerClass(Horse)
|
||||||
|
local bojack = Horse('Bojack Horseman')
|
||||||
|
test_serdeser(bojack)
|
||||||
|
local new_bojack = serdeser(bojack)
|
||||||
|
assert.are.equal(new_bojack.__class, Horse)
|
||||||
|
bitser.unregisterClass('Horse')
|
||||||
|
end)
|
||||||
it("serializes custom class instances", function()
|
it("serializes custom class instances", function()
|
||||||
local Horse_mt = bitser.registerClass('Horse', {__index = {}}, nil, setmetatable)
|
local Horse_mt = bitser.registerClass('Horse', {__index = {}}, nil, setmetatable)
|
||||||
local function Horse(name)
|
local function Horse(name)
|
||||||
|
Loading…
Reference in New Issue
Block a user