需求背景
一个服务缓存玩家信息到对象里,通过对象的函数定时同步到数据库中,如果玩家掉线 清空对象,但是后续步骤导致对象数据需要变更,对象不存在, 就不方便变更了,怎么处理?
方案思考
1.临时新建对象
既然更新数据依赖对象,判断对象不存在的时候,先新建对象,再使用对象操作。
2.延后处理
判断对象不存在的时候,先记录函数名和参数,等对象下次出现的时候,延后调用。
方案选择
因为项目中使用的对象涉及到网络,玩家掉线情况下,参数不全,无法新建对象,所以选延后处理的方案比较合适。
具体代码
demo
local myFunction2 = function(arg1, arg2, arg3)
print(arg1, arg2, arg3)
end
local myFunction = function(arg1, arg2, arg3)
local t = {arg1, arg2, arg3}
local args = table.pack(arg1, arg2, arg3)
myFunction2(table.unpack(args))
end
myFunction("hello", 42, {a = 2, b = 3})
第一版
- 存
-- 导入 lua-cjson 库
local cjson = require("cjson")
-- 定义一个要序列化的函数
local myFunction = function(arg1, arg2, arg3)
print(arg1, arg2, arg3)
end
-- 定义函数的参数
local args = {1, "hello", {a = 2, b = 3}}
-- 序列化函数和参数
local serializedData = cjson.encode({func = myFunction, args = args})
-- 打印序列化后的数据
print(serializedData)
- 取
-- 导入 lua-cjson 库
local cjson = require("cjson")
-- 被序列化的数据
local serializedData = '{"func":null,"args":[1,"hello",{"a":2,"b":3}]}'
-- 反序列化数据
local data = cjson.decode(serializedData)
-- 获取函数和参数
local myFunction = data.func
local args = data.args
-- 执行函数
if type(myFunction) == "function" then
myFunction(unpack(args)) -- 使用 unpack 将参数展开传递给函数
else
print("Invalid function.")
end
序列化之后可以存入redis,我这里使用的是redis的list。
其他
- 实际使用过程中碰到一些问题,比如
cjson.encode
的时候报错Cannot serialise table: excessively sparse array
,原因是实际业务的args过于复杂。
这个错误通常发生在你尝试使用 cjson.encode 函数序列化一个 Lua 表时,而这个表包含了“过于稀疏”的数组部分。所谓“过于稀疏”是指数组中存在很多 nil 元素,而 cjson 在序列化时对这样的数组处理有一些限制。
- 查了一些解决方案,最后使用的是
cjson.encode_sparse_array(true)
local serializedData = cjson.encode({func = myFunction, args = {arg1, arg2, arg3})
-- ... 此处省略中间过程
local data = cjson.decode(serializedData)
if data.func and self[data.func] then
local args = data.args or {}
self[data.func](self, args[1], args[2], args[3], args[4], args[5], args[6], args[7])
end
end
- 因为是通用方案,所以参数支持到7位,一般lua函数参数一般不会有这么多,实在超了,只能再加了。
原文地址:https://blog.csdn.net/weixin_41093846/article/details/134569225
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_2087.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。