从 JSON 解码后无法调用方法。

我有一个 Lua 类,类似下面的代码段。我正在使用 json 来序列化对象并将其放入键值存储中。我能够成功地序列化对象并将其放入键值存储中,但在我从键值存储中检索对象后,无法调用对象的任何方法。我了解 json 模块在编码时跳过方法,解码后我的对象没有方法。

是否有一种方法,我可以在从 json 解码对象到 lua 后向类追加方法?类似于 C 语言中的函数指针。

local class_name = "user_object";
user_object = {};  --user class

function user_object.new (mobile, password, uid)

    local self = {};
    self.mobile = mobile;
    self.uid    = uid; -- generate a uid which is a running number.
    self.password = password;
    self.messages_sent = 0;
    self.put_request_count = 0;
    self.get_request_count = 0;
    self.last_time_active = "";
    self.get_tickets = {};
    self.put_tickets = {};
    self.group_message_stream = {};
    self.group_ownerships = {}; -- group names which he is owner of
    self.group_memberships = {}; -- group names  which he is member of
    self.sent_poke_count = 0;
    self.sent_poke_stream = {};
    self.recv_poke_count = 0;
    self.recv_poke_stream = {};

    function self:add_put_ticket(ticketid)
        table.insert(self.put_tickets, ticketid);
        self:incr_put_count();
        self:save();
        return;
    end

    function self:add_get_ticket(ticketid)
        table.insert(self.get_tickets, ticketid);
        self:incr_get_count();
        self:save();
        return;
    end
点赞
用户206020
用户206020

你可以使用元表来实现这个。

user = { name = 'ponzao' } -- 一个包含值的表。
User = {}                  -- 包含函数的表。
function User:allCapsName() return self.name:upper() end -- 一个方法。
setmetatable(user, {__index = User}) -- 未定义的键都被调度到 User 。
print(user:allCapsName()) --> "PONZAO"
2011-05-13 06:44:54
用户169828
用户169828

Lua 中的函数是一等公民对象,你可以将函数存储在任何变量中。代码

function self:add_put_ticket(ticketid)

等价于

self.add_put_ticket = function (self, ticketid)

从这里开始,该怎么做应该是显而易见的:在可访问的位置定义所需的方法,在反序列化后将它们分配给适当的字段。

2011-05-13 09:05:36