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程序,用不到序列化和反序列化.写一个排序算法也用不到序列化和反序列化.但是当你想要将一个对象进行持久化写入文件,或者你想 ...
 
随机推荐
- redis随笔集-使用
			
redis是一个开源的.使用C语言编写的.支持网络交互的.可基于内存也可持久化的Key-Value数据库 一数据集合: 1.list -- 链表 key-value形式,通过list ID 可以实 ...
 - [网络技术][转]路由表查找过程(ip_route_input_slow)
			
若干解释: 判断in_dev是否存在,是通过mac地址吗? 源IP地址如果是multicast,broadcast,loopback地址,意味着数据报不知道从哪来的,只能把数据报废掉了. 目标IP地 ...
 - shell 简单计算脚本
 - javascript:window.history.go(-1)
			
history是你浏览过的网页的url(简单的说就是网址)的集合,也就是你的浏览器里的那个历史记录.它在js里是一个内置对象,就跟document一样,它有自己的方法,go就是其中一个. 这个方法的参 ...
 - css样式多个类、标签用【逗号 空格 冒号 点】分开的解析
			
一:#a,b{…………} id叫a和一个标签是b的样式(平行关系) 二:#a b{…………} id叫a下面的一个标签是b的样式(包含关系) 三:#a.b{…………} id叫a的下面的class叫 ...
 - Java中静态内部类的理解
			
class A { public void func() { A a=new A(); C c=a.new C(); } public static void main(String[] args) ...
 - 浅谈 Struts2 面试题收藏
			
Struts2面试题 一.工作原理 一个请求在Struts2框架中的处理大概分为以下几个步骤 1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求 2 这个请求经过一系列的过滤器(Fi ...
 - String类常用方法小节
			
(1)String.equals() 返回值是boolean类型 equals(Object anObject) 将此字符串与指定的对象比较. (2)length() 返回值是in ...
 - Spark的Straggler深入学习(2):思考Block和Partition的划分问题——以论文为参考
			
一.partition的划分问题 如何划分partition对block数据的收集有很大影响.如果需要根据block来加速task的执行,partition应该满足什么条件? 参考思路1:range ...
 - 解决:j-link V8下载器灯不亮,无法正常烧写固件
			
昨天j-link V8下载仿真F4正常,下午下载仿真F1后吃了个饭,然后它的灯就不亮了...按照这个例程弄了好几遍都不行,http://www.cr173.com/soft/98542.html,卡在 ...