繁体   English   中英

PHP:对象数组 - serialize vs json_encode - 替代?

[英]PHP: array of objects - serialize vs json_encode - alternatives?

在PHP中,我很难在大型对象(100000+个对象)上使用serialize /反unserialize 这些对象可以有很多不同的类型,但都是基类的后代。

不知怎的,当我在对象数组上使用unserialize时,大约有0,001%的对象生成错误! 而是生成完整的不同对象。 这不是随机发生的,而是每次都使用相同的对象。 但是,如果我改变数组的顺序,它会发生在不同的对象上,所以这看起来像是一个bug。

我切换到json_encode / json_decode ,但发现这总是使用stdClass作为对象的类。 我通过将每个对象的类名包含为属性来解决这个问题,然后使用此属性构造新对象,但此解决方案不是很优雅。

使用var_exporteval工作正常,但比其他方法慢大约3倍,并且使用更多的内存。

现在我的问题是:

  • 什么可能导致使用反unserialize创建的错误/错误对象?
  • 是否有更好的方法将json_decode与对象数组一起使用,以便类以某种方式自动存储在json中?
  • 是否有可能在PHP中读取/写入大量对象的其他方法?

UPDATE

我开始相信我的数组数据一定有些奇怪,因为使用msgpack_serialize (php扩展,替代serialize )我得到了同样的错误(但奇怪的是, 不会生成相同的对象错误!)。

更新2

找到了一个解决方案:不是在整个数组上进行serialize ,而是在每个对象上进行 ,首先serialize然后再使用base64_encode ,然后将每个序列化对象作为单独的行存储在文本文件中。 这样我就可以生成整个对象数组,然后使用带有unserializebase64_decode file()迭代每个对象:不再有错误!

使用序列化/非序列化函数,可以连接两种魔术方法。

__睡觉()

serialize()检查您的类是否具有魔术名称__sleep()的函数。 如果是,则在任何序列化之前执行该功能。 它可以清理对象,并且应该返回一个数组,其中包含应该序列化的该对象的所有变量的名称。 如果该方法没有返回任何内容,则序列化NULL并发出E_NOTICE。

使用sleep可以更好地控制序列化,可以传递可序列化的变量和清理资源的序列化。

当调用unserialize时,应该提到另一个函数

__醒来()

__wakeup()的预期用途是重新建立在序列化期间可能已丢失的任何数据库连接并执行其他重新初始化任务。

关于json_encode()

  1. 它没有魔术方法__wakeup,__ snle,所以你控制力较弱
  2. 它不会序列化私有属性
  3. 对象始终存储为stdClass
  4. Json_encode比序列化更快

这取决于你选择的内容,但是对于带有数据库连接等的更高级的类。我建议序列化()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM