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程序,用不到序列化和反序列化.写一个排序算法也用不到序列化和反序列化.但是当你想要将一个对象进行持久化写入文件,或者你想 ...
随机推荐
- Jquery与CSS选择器参考手册
- 方法的重载overload
/*方法的重载overload * 重载:在同一个类里可以定义一个或者一个以上的方法 * 参数类型不一致 * 参数数量不一致 * */ public class Chongza ...
- Integrating AngularJS with RequireJS
Integrating AngularJS with RequireJS When I first started developing with AngularJS keeping my contr ...
- android系统自带的日期、时间对话框的用法
代码: package com.test; import java.util.Calendar; import android.app.Activity; import android.app.Dat ...
- Spark的Straggler深入学习(2):思考Block和Partition的划分问题——以论文为参考
一.partition的划分问题 如何划分partition对block数据的收集有很大影响.如果需要根据block来加速task的执行,partition应该满足什么条件? 参考思路1:range ...
- spring 源码
spring AOP的Advice(通知) Advice(通知)定义在连接点做什么,为切面增强提供织入接口. BeforeAdvice AfterAdvice ThrowsAdvice的设计,体现了A ...
- mybatis学习2
解决字段名与实体类属性名不相同的冲突 1. 准备表和数据:CREATE TABLE orders(order_id INT PRIMARY KEY AUTO_INCREMENT,order_no VA ...
- swift 构建类
参开 http://blog.csdn.net/chelongfei/article/details/49784633 在 Swift 中, 类的初始化有两种方式, 分别是 Designated In ...
- java web开发小细节
<!--1. 在form表单中的action里用绝对路径而不是相对路径--> <form action="${basePath}loginForm" name=& ...
- list排序
今天要对List排序,上网查了很多方法都感觉比较麻烦,现在终于找到了两种比较简便的方式,在此写出来,防止忘记!同时供大家参考! using System; using System.Collectio ...