对象序列化/反序列化如何工作?

Sol*_*per 7 php object-serialization

我正在阅读关于PHP的序列化/反序列化概念.我想知道它们是如何存储在filesystem/db中的.我猜它是二进制格式.但是,我想知道整个班级是如何存储的?我知道数据成员中的数据可以存储,但方法是如何存储的?

我的意思是,PHP如何知道在函数中编写的代码是什么someFunc()

$obj = new ClassName();
$obj->someFunc();
$serial = serialize($obj);
$unserialobj = unserialize($serial);
$unserialobj->someFunc();
Run Code Online (Sandbox Code Playgroud)

PHP可以知道第2行要做什么,但它知道如何在#5行中做一个非序列化对象?它也保存代码吗?

dec*_*eze 9

序列化对象时,PHP仅存储对象的当前状态,即其属性值.它没有序列化它的方法.在反序列化时,需要在内存中加载相应的类.PHP将从序列化字符串中恢复对象的状态,并从同名的类中获取其余信息(结构和方法).

  • @user只是'include'my_class.php';`.PHP只需要看到你的类的定义.换句话说,如果你可以做`new ClassName`,那么你可以反序列化`ClassName`类型的对象. (2认同)

Bol*_*ock 6

PHP可以知道在第2行做什么,但是如何知道在第5行这是一个未序列化的对象呢?它也保存代码吗?

是的,serialize()将保存有关该对象是其实例的类的信息以及其状态,因此,在反序列化时,您将获得该类的实例,在这种情况下为ClassName