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

Dyl*_*lan 6 php arrays serialization json object

在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,然后我存储每个序列化的对象,如文本文件的单独一行.采用这种方式,我可以生成对象的整个数组,然后遍历每个对象file()unserializebase64_decode :没有更多的错误!

Rob*_*ert 4

通过序列化/反序列化函数,可以连接 2 个魔术方法。

__睡觉()

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

通过睡眠,您可以更好地控制序列化操作,您可以传递可序列化的变量并在序列化之前清理资源。

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

__醒来()

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

关于 json_encode()

  1. 它没有神奇的方法 __wakeup, __sleep 所以你的控制权较少
  2. 它不序列化私有属性
  3. 对象始终存储为 stdClass
  4. Json_encode 比序列化更快

这取决于你的选择,但对于具有数据库连接等的更高级的类。我建议使用serialize()