java 反序列化php_PHP--序列化与反序列化详解

PHP--序列化与反序列化详解

博客说明

文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢!

说明

所有php里面的值都可以使用函数serialize()来返回一个包含字节流的字符串来表示。unserialize()函数能够重新把字符串变回php原来的值。 序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字。

为了能够unserialize()一个对象,这个对象的类必须已经定义过。如果序列化类A的一个对象,将会返回一个跟类A相关,而且包含了对象所有变量值的字符串。 如果要想在另外一个文件中解序列化一个对象,这个对象的类必须在解序列化之前定义,可以通过包含一个定义该类的文件或使用函数spl_autoload_register()来实现。

PHP序列化:serialize

序列化是将变量或对象转换成字符串的过程。

class student{

public $name;

public $age;

public $number;

//_construct:创建对象时初始化

function __construct($name,$age,$number){

$this->name = $name;

$this->age = $age;

$this->number = $number;

}

}

$student = new student("Jack",22,11086);

var_dump(serialize($student));

?>

测试运行

c872baead72753f48cda2ea41c054388.png

string(76) "O:7:"student":3:{s:4:"name";s:4:"Jack";s:3:"age";i:22;s:6:"number";i:11086;}"

PHP反序列化:unserialize

反序列化是将字符串转换成变量或对象的过程。

class student{

public $name;

public $age;

public $number;

//_construct:创建对象时初始化

function __construct($name,$age,$number){

$this->name = $name;

$this->age = $age;

$this->number = $number;

}

}

$student = 'O:7:"student":3:{s:4:"name";s:4:"Jack";s:3:"age";i:22;s:6:"number";i:11086;}';

var_dump(unserialize($student));

?>

测试运行

fb1f50ccf12f72f96349edb387b57252.png

object(student)#1 (3) {

["name"]=>

string(4) "Jack"

["age"]=>

int(22)

["number"]=>

int(11086)

}

魔术函数

函数

说明

__construct()

类的构造函数

__destruct()

类的析构函数

__call()

在对象中调用一个不可访问方法时调用

__callStatic()

用静态方式中调用一个不可访问方法时调用

__get()

获得一个类的成员变量时调用

__set()

设置一个类的成员变量时调用

__isset()

当对不可访问属性调用isset()或empty()时调用

__unset()

当对不可访问属性调用unset()时被调用

__sleep()

执行serialize()时,先会调用这个函数

__wakeup()

执行unserialize()时,先会调用这个函数

__toString()

类被当成字符串时的回应方法

__invoke()

调用函数的方式调用一个对象时的回应方法

__set_state()

调用var_export()导出类时,此静态方法会被调用

__clone

当对象复制完成时调用

__autoload()

尝试加载未定义的类

__debugInfo()

打印所需调试信息

为什么突然说到魔术函数呢,因为在序列化和反序列化的时候经常会用到__construct(),__destruct(),__sleep(),__wakeup()

在后面的博客里面有相应的ctf实例

感谢

万能的网络

以及勤劳的自己

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 对象的序列化是将对象的状态转换为字节流,以便将其存储在文件中或通过网络进行传输。而反序列化则是将字节流重新转换为对象,以便在程序中重新使用。 对象的序列化主要涉及到两个接口,即 Serializable 和 Externalizable。Serializable 接口是 Java 标准序列化机制的简单版本,所有需要序列化的类都需要实现这个接口。而 Externalizable 接口则需要自己实现序列化反序列化的方法。 在进行对象序列化时,可以使用 ObjectOutputStream 类来实现。通过这个类的 writeObject() 方法,可以将对象写入到输出流中。而在进行反序列化时,可以使用 ObjectInputStream 类来实现。通过这个类的 readObject() 方法,可以将字节流重新转换为对象。 对象序列化的主要用途包括: 1. 对象的持久化:通过将对象序列化后存储在文件中,可以实现对象的持久化,当程序再次启动时,可以反序列化读取文件并重新获取对象的状态。 2. 对象的传输:通过将对象序列化后通过网络传输,可以实现在不同计算机之间的对象传递。 在进行对象序列化时,需要注意以下几点: 1. 需要被序列化的对象和其引用的对象,都需要实现 Serializable 接口。 2. 对于不希望被序列化的属性,可以使用 transient 关键字进行标记。 3. 如果序列化的是一个对象的成员变量,而不是整个对象,那么成员变量对应的类也需要实现 Serializable 接口。 总之,Java 对象序列化反序列化是一种非常有用的机制,它可以将对象的状态转换为字节流进行存储或传输,以便在需要时重新获取对象。通过使用序列化机制,我们可以实现对象的持久化和传输,使得编程更加灵活和便捷。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值