【问题标题】:How do I implement the Serializable interface to serialize/unserialize a class to/from native type如何实现 Serializable 接口以将类序列化/反序列化到本机类型
【发布时间】:2016-02-04 03:16:04
【问题描述】:

下面是我的课:

class Pot implements Serializable
{
    protected $a=1;
    protected $b=2;

    public function serialize()
    {
        return serialize(['a'=>$this->a,'b'=>$this->b]);
    }
    public function unserialize($data)
    {
        $values = unserialize($data);
        $this->a = $values['a'];
        $this->b = $values['b'];
    }
}

$Ser = serialize(new Pot);
//THIS IS WHAT I NEED:
// a:2:{s:1:"a";i:1;s:1:"b";i:2;}

我希望将该类序列化为一个简单的数组,因为我需要将其传递给外部系统,但仍想在我的系统中将其反序列化为原始类。
怎么样?

【问题讨论】:

  • 是的,这是完全不同的问题。我将该问题标记为由管理员删除。最大的区别是我需要从序列化函数返回的序列化字符串的值

标签: php object serialization integration php-5.5


【解决方案1】:

如果你将它序列化为一个简单的数组,那么系统无法判断它最初是一个Pot,因此当你反序列化时你将无法以这种方式获得Pot。如果您有一个名为Box 的类,您还想将其序列化为数组,该怎么办。系统如何知道应该实例化哪个类?

您可能必须这样做:

  • 编写一个特定的方法,从您的Pot 类中返回您想要的数组。
  • 使用它来获取您的序列化字符串,使其没有类信息。
  • 然后你需要某种工厂函数/类,它接受一个序列化数组并创建一个 Pot 类,然后使用 setter/constructor 设置属性如果它们不都是Pots,那么你需要知道你想把哪些字符串变成Pots。 (不过,我怀疑这不是问题。)

Serialize 接口并不能真正帮助您解决这个问题。我不认为。

【讨论】:

  • 谢谢...这就是我目前所做的,希望有更内置的方法来做到这一点。
  • 不,不这么认为。一旦它是一个简单的数组(序列化),系统就无法分辨它以前是什么。
  • 理论上我可以想出一种在我转换为简单数组的对象内转换和实现反序列化函数的方法。然后 php 引擎会知道将此字符串发送到正确的位置。我觉得现在这是 PHP Internals 开发者小组讨论的内容
猜你喜欢
  • 2010-12-08
  • 2014-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-28
  • 2012-02-17
  • 1970-01-01
  • 2020-01-17
相关资源
最近更新 更多