在PHP中,我很难在大量对象(100000+个对象)上使用serialize
/ unserialize
。这些对象可以有很多不同的类型,但都是基类的后代。
不知何故,当我在对象数组上使用unserialize
时,大约有0,001%的对象生成错误!而是生成完整的不同对象。这不是随机发生的,而是每次都使用相同的对象。但是,如果我改变数组的顺序,它会发生在不同的对象上,所以这看起来像是一个bug。
我切换到json_encode
/ json_decode
,但发现这总是使用stdClass
作为对象的类。我通过将每个对象的类名包含为属性来解决这个问题,然后使用此属性构造一个新对象,但这个解决方案不是很优雅。
将var_export
与eval
一起使用可以正常工作,但比其他方法慢3倍,并且使用的内存要多得多。
现在我的问题是:
unserialize
?json_decode
与对象数组一起使用,以便类以某种方式存储在json中
自动?的更新 的
我开始相信我的数组数据一定有些奇怪,因为使用msgpack_serialize
(php扩展,替代serialize
)我会得到同样的错误(但奇怪的是不生成错误的相同对象!)。
更新2
找到一个解决方案:不是在整个数组上执行serialize
,而是在每个对象上进行,先是serialize
,然后是base64_encode
,然后我将每个序列化对象作为单独的行存储在文本文件中。这样我就可以生成整个对象数组,然后使用file()
unserialize
和base64_decode
来迭代每个对象:不再有错误!
答案 0 :(得分:3)
使用序列化/非序列化函数连接2个魔术方法。
serialize()检查您的类是否具有魔术名称__sleep()的函数。如果是,则在任何序列化之前执行该功能。它可以清理对象,并且应该返回一个数组,其中包含应该序列化的该对象的所有变量的名称。如果该方法没有返回任何内容,则序列化NULL并发出E_NOTICE。
使用sleep可以更好地控制序列化,可以传递可序列化的变量和清理资源。
当调用unserialize时,应该提到另一个函数
__wakeup()的用途是重新建立序列化过程中可能丢失的任何数据库连接,并执行其他重新初始化任务。
关于json_encode()
这取决于你选择的内容,但是对于带有数据库连接等的更高级的类。我建议序列化()