Lua Serial/Serialize/Serializer/Serializing 序列化/反序列化
第一篇 有点内容的..
支持 表/函数/数值/布尔/字符串 做 键、值
支持 循环/嵌套
支持 元表(支持弱表分析)
支持 表被任意数量、位置引用
支持 扩展引用外部
支持 格式化输出
支持 嵌套优化(分析依赖情况)
示例:
local asserteq = require 'pl.test'.asserteq
local t1, t2, t3, result t1 = {f1 = , f2 = true, f3 = 'f3', 'i1', 'i2'}
asserteq(deserialize(serialize(t1)),t1)
--[[return function(externList)
local internList
internList =
{
{
"i1", "i2",
["f3"]="f3", ["f2"]=true, ["f1"]=1,
},
} return internList[1]
end]] --嵌套优化
t1, t2, t3 = {'T1'}, {'T2'}, {'T3'}
t1.t2 = t2
t2.t3 = t3
asserteq(deserialize(serialize(t1)),t1)
--[[return function(externList)
local internList
internList =
{
{
"T1",
["t2"]={
"T2",
["t3"]={
"T3",
},
},
},
} return internList[1]
end]] t1, t2, t3 = {'T1'}, {'T2'}, {'T3'}
t1.t2 = t2
t3.t2 = t2
asserteq(deserialize(serialize{t1, t3}),{t1, t3})
--[[return function(externList)
local internList
internList =
{
{
{
"T1",
["t2"]="<internList[2]>",
}, {
"T3",
["t2"]="<internList[2]>",
},
}, {
"T2",
},
} internList[1][1]["t2"]=internList[2]
internList[1][2]["t2"]=internList[2] return internList[1]
end]] --对象做键,循环
t1, t2, t3 = {'T1'}, {'T2'}, {'T3'}
t1[t2] = t2
t3[t2] = t2
-- asserteq(deserialize(serialize{t1, t3}),{t1, t3})
-- 'asserteq'没法比较,反序列化生成了新的't2'。
--[=[print(serialize{t1, t3})
return function(externList)
local internList
internList =
{
{
"T2",
}, {
{
"T1",
--["<internList[1]>"]=nil,
}, {
"T3",
--["<internList[1]>"]=nil,
},
},
} internList[2][2][internList[1]]=internList[1]
internList[2][1][internList[1]]=internList[1] return internList[2]
end]=] --循环 嵌套
t1, t2, t3 = {'T1'}, {'T2'}, {'T3'}
t1[t2] = t2
t2[t3] = t3
t3[t1] = t1
--[=[print(serialize{t1, t2, t3})
return function(externList)
local internList
internList =
{
{
"T1",
--["<internList[3]>"]=nil,
}, {
"<internList[1]>", "<internList[3]>", "<internList[4]>",
}, {
"T2",
--["<internList[4]>"]=nil,
}, {
"T3",
--["<internList[1]>"]=nil,
},
}
internList[3][internList[4]]=internList[4]
internList[2][1]=internList[1]
internList[2][3]=internList[4]
internList[2][2]=internList[3]
internList[1][internList[3]]=internList[3]
internList[4][internList[1]]=internList[1] return internList[2]
end
]=]
--asserteq(deserialize(serialize{t1, t2, t3}),{t1, t2, t3})
-- 'asserteq'无法处理循环 --externList
t1, t2, t3 = {'T1'}, {'T2'}, {'T3'}
t1[t2] = t2
t3[t2] = t2
asserteq(deserialize(serialize({t1, t3},{t2}),{t2}),{t1, t3})
--[=[return function(externList)
local internList
internList =
{
{
{
"T1",
[externList[1]]=externList[1],
}, {
"T3",
[externList[1]]=externList[1],
},
},
} return internList[1]
end]=] --metatable
setmetatable(t1, t2)
asserteq(deserialize(serialize({t1, t3},{t2}),{t2}),{t1, t3})
--[=[return function(externList)
local internList
internList =
{
externList[1], {
"<internList[3]>", {
"T3",
[externList[1]]=externList[1],
},
}, {
"T1",
[externList[1]]=externList[1],
},
} internList[2][1]=internList[3] setmetatable(internList[3], externList[1]) return internList[2]
end]=] result = serialize({t1, t3},{t2})
asserteq({string.len(result), string.len(binaryString(result))}, {, })
asserteq(deserialize(binaryString(result),{t2}),{t1, t3}) print "test on 'serialize' OK"
代码整理中..
不喜欢这个编辑器..但没空折腾..阻碍发随笔啊..
其他关键词: Lua 表 存储 保存 字符串 解析
Lua Serial/Serialize/Serializer/Serializing 序列化/反序列化的更多相关文章
- JSR310-LocalDateTime序列化 & 反序列化
问题 springboot 版本:spring-boot 2.3.12 今天在开发一个redis 热key服务端的过程中,碰到2个问题: jdk8的LocalDateTime,LocalDate,Lo ...
- 序列化 反序列化 MessagePack for C#
阅读目录 快速序列化组件MessagePack介绍 简介 使用 快速开始 分析器 内置的支持类型 对象序列化 DataContract兼容性 序列化不可变对象(序列化构造器) 序列化回调 Union ...
- json 常用的序列化 反序列化对象 代码
序列化对象: ---------------------------------------------------------- Person p = new Person() { Name = & ...
- 一个更好的C++序列化/反序列化库Kapok
KapokFAQ1.Kapok的特点简单,易用,header-only,只需要引用Kapok.hpp即可:高效,初步测试性和messagepack相当.它是纯c++11实现,因此需要支持C++11的编 ...
- C# 序列化反序列化XML的帮助类
以下是一个包装的用于序列化反序列化XML和C# 对象的类. public class XmlSerializeHelper<T> { #region Serial ...
- 测试了下boost的序列化反序列化功能
// testSerialization.cpp : Defines the entry point for the console application. // #include "st ...
- 序列化反序列化api(入门级)
定义: java序列化是指把Java对象转换为字节序列的过程:而Java反序列化是指把字节序列恢复为Java对象的过程. 为什么字符串通常也会进行序列化? 对象需要进行序列化的原因:保证对象的状态不变 ...
- C#之你懂得的序列化/反序列化
前言:写此文章一方面是为了巩固对序列化的认识,另一方面是因为本人最近在面试,面试中被问到“为什么要序列化”.虽然一直在使用,自己也反复的提到序列化,可至于说为什么要序列化,还真的没想过,所以本文就这样 ...
- java序列化反序列化深入探究
When---什么时候需要序列化和反序列化: 简单的写一个hello world程序,用不到序列化和反序列化.写一个排序算法也用不到序列化和反序列化.但是当你想要将一个对象进行持久化写入文件,或者你想 ...
随机推荐
- Ubuntu下mysql-server的安装
(1)更新 #apt-get update (2)安装 #apt-get install mysql-server 出现窗口设置"root"用户的密码为"456456&q ...
- TypeScript Handbook 2——接口1(翻译)
接口(Interfaces) One of TypeScript's core principles is that type-checking focuses on the 'shape' that ...
- Ext JS 4 新特性2:配置项属性(config)之一
Ext JS 4 新特征2:配置项属性config 最新版本的Ext JS 4.2的另外一个伟大的新特征就是增加了configuration配置项属性,当我们在创建一个新类的时候,经常性的要设置某某属 ...
- C++程序内存泄漏检测方法
一.前言 在Linux平台上有valgrind可以非常方便的帮助我们定位内存泄漏,因为Linux在开发领域的使用场景大多是跑服务器,再加上它的开源属性,相对而言,处理问题容易形成“统一”的标准.而在W ...
- swift block
let addWaterVC = MLSelectPhotoPickerViewController() addWaterVC.callBack = { (AnyObject) -> () in ...
- C语言程序设计第9堂作业
一.本次课主要内容: 本章将散布在前五章中的数据类型和表达式等内容做了归纳性的汇总,本次课需要掌握以下两个方面: (1)本次课通过从数据在计算机内的存储格式入手,介绍整型.字符型.单精度和双精度实型四 ...
- 自定义 placeholder 文本颜色
原文 http://zhuyujia.github.io/2016/01/custom-placeholder-text-color.html Css: ::-webkit-input-placeh ...
- C#方法参数传递机制
1:value(值传递).ref(引用传递).out(输出传递) ref和out使用效果上面是等效的,它们的区别在于:参数标记为ref,那么必须在调用函数之前初始化参数的值:参数标记为out,调用函数 ...
- cell 内部 设置width 总不对
今天 在Cell 里设置屏幕宽 如果 在layoutSubviews 使用 self.width(自己写的分类) 或者 self.view.size.width 都可以,这里 4 4s 5 5s 都 ...
- spring.net 如何让xml智能提示
tools ->options ->Text Editor ->xml ->miscellaneous ->network ->勾选 automatically d ...