我需要在平面文件中存储多维关联数据数组以用于缓存目的.我偶尔会遇到将其转换为JSON以便在我的Web应用程序中使用的需要,但绝大多数时候我将直接在PHP中使用该数组.
将数组作为JSON或PHP序列化数组存储在此文本文件中会更有效吗?我环顾四周,似乎在最新版本的PHP(5.3)中,json_decode
实际上比它更快unserialize
.
我目前倾向于将数组存储为JSON,因为我觉得如果有必要,人们可以更容易地阅读它,它可以在PHP和JavaScript中轻松使用,而且从我读过的,它甚至可能是更快解码(不确定编码).
有谁知道任何陷阱?任何人都有良好的基准来展示这两种方法的性能优势?
我想将一个完整的PHP对象图序列化为JSON字符串表示,并将其反序列化为相同的PHP对象图.
以下是我考虑的选项摘要,以及它们不适合我的原因:
serialize()
没有做我想要的,因为它使用特定于PHP的格式.我想要一种大多数语言广泛支持的格式,以及人类可读/可编辑的格式.
json_encode()
没有做我想要的,因为它只做简单的值和数组,而不是对象.(我实际上是在我的实现中使用它,见下文.)
var_export()
不处理循环引用,并且不执行我想要的操作(参见上文.)(请注意,我当前的实现也不处理循环引用 - 请参阅下面的注释和回复以澄清此问题.)
Sebastian Bergmann的Object Freezer是一个很好的实现,但它不能做我想要的 - 它使用很长的形式,并依赖于使用GUID填充序列化对象.
序列化没有做我想要的 - 它实际上不执行序列化,它解析输出serialize()
并产生不同的表示,例如XML,但无法解析该表示.(它也不支持JSON - XML格式很长,并不是我想要的.)
我现在有一个工作实现分享:
https://github.com/mindplay-dk/jsonfreeze
对象图的JSON表示如下所示:
{
"#type": "Order",
"orderNo": 123,
"lines": [{
"#type": "OrderLine",
"item": "milk \"fuzz\"",
"amount": 3,
"options": null
}, {
"#type": "OrderLine",
"item": "cookies",
"amount": 7,
"options": {
"#type": "#hash",
"flavor": "chocolate",
"weight": "1\/2 lb"
}
}],
"paid": true
}
Run Code Online (Sandbox Code Playgroud)
此方法旨在用于纯树结构聚合 - 不允许循环引用,也不允许对同一对象进行多次引用.换句话说,这不是通用的,例如serialize()
,unserialize()
任何PHP对象图的功能.
在我最初的方法中,我使用了一个序列化的表单,它基本上是一个基础0对象列表.列表中的第一个对象(编号0)是序列化对象图的根,任何其他对象按其找到的顺序存储.
在当前实现中,JSON表示类似于可能的扩展的原始树结构,使得实际使用JavaScript中的对象图的JSON表示成为可能.唯一的偏差是magic #type
属性(前缀为#以防止与属性名冲突)和 …