gpt4 book ai didi

PHP:对象数组 - 序列化与 json_encode - 替代方案?

转载 作者:可可西里 更新时间:2023-11-01 13:26:30 24 4
gpt4 key购买 nike

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

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

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

var_exporteval 一起使用效果很好,但比其他方法慢 3 倍左右,并且占用更多内存。

现在我的问题是:

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

更新

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

更新 2

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

最佳答案

序列化/反序列化函数连接了 2 个魔法方法。

__sleep()

serialize() checks if your class has a function with the magic name __sleep(). If so, that function is executed prior to any serialization. It can clean up the object and is supposed to return an array with the names of all variables of that object that should be serialized. If the method doesn't return anything then NULL is serialized and E_NOTICE is issued.

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

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

__wakeup()

The intended use of __wakeup() is to reestablish any database connections that may have been lost during serialization and perform other reinitialization tasks.

关于 json_encode()

  1. 它没有神奇的方法 __wakeup、__sleep,因此您的控制力较弱
  2. 它不序列化私有(private)属性
  3. 对象总是存储为 stdClass
  4. Json_encode 比序列化更快

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

关于PHP:对象数组 - 序列化与 json_encode - 替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17489463/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com