使用Java实现PHP的序列化和反序列化函数serialize和unserialize的功能
发布于 2021-05-12 23:54 ,所属分类:区块连和PHP开发学习资料
1. 介绍
1.1 介绍
福哥最近在把一部分功能从PHP转入Java里面,在处理PHP的序列化(Serialize)数据的时候遇到了问题,经过一番折腾找到了一个在Java里实现序列化的功能的第三方库。
现在,福哥将这个库的使用方法交给大家!!
2. 依赖
首先导入phprpc的依赖库
<dependency><groupId>org.sction</groupId><artifactId>phprpc</artifactId><version>3.0.2</version></dependency>
3. 使用
使用PHPSerializer反序列化经过PHP序列化过的字符串需要知道目标字符串里存的是什么类型的数据,不同的数据类型是需要使用不同的实体对象去接收反射数据的。
3.1 单字符串类型
原数据就是一个字符串
try {PHPSerializer ps = new PHPSerializer();String s;s = (String) ps.unserialize(new String("s:12:\"福哥真好\";").getBytes(), String.class);return s;}catch (Exception e){e.printStackTrace();}

3.2 单整型类型
原数据就是一个整型数字
try {PHPSerializer ps = new PHPSerializer();Integer s;s = (Integer) ps.unserialize(new String("i:518168;").getBytes(), Integer.class);return s;}catch (Exception e){e.printStackTrace();}
3.3 单双精类型
原数据就是一个小数
try {PHPSerializer ps = new PHPSerializer();Double s;s = (Double) ps.unserialize(new String("d:518168.99;").getBytes(), Double.class);return s;}catch (Exception e){e.printStackTrace();}
3.4 NULL类型
原数据就是一个null,由于没有类型,反序列化会失败
try {PHPSerializer ps = new PHPSerializer();String s;s = (String) ps.unserialize(new String("N;").getBytes(), String.class);return s;}catch (Exception e){e.printStackTrace();}
3.5 实体对象类型
如果原数据是一个对象(就是数组的下标为字符串的情况),那么就可以建立同样结构的实体对象,使用这个实体对象可以直接接收数组数据
注意:实体对象必须是public的
3.5.1 实体对象
@Datapublic class MyUser {Integer id;String name;String note;}
3.5.2 反序列化
try {PHPSerializer ps = new PHPSerializer();MyUser s;s = (MyUser) ps.unserialize(new String("a:3:{s:2:\"id\";i:35;s:4:\"name\";s:15:\"鬼谷子叔叔\";s:4:\"note\";s:1:\"s\";}").getBytes(), MyUser.class);return s;}catch (Exception e){e.printStackTrace();}

3.6 数组类型
如果原数据是一个数组(就是数组下标为数字的情况)的话,那么可以使用AssocArray类型将结果集先收集起来,然后再使用Cast对象将数据转换成Java对应的类型
注意:实体对象必须是public的
3.6.1 实体对象
@Datapublic class MyTag {Integer id;String tag;}
3.6.2 反序列化
try {PHPSerializer ps = new PHPSerializer();List<MyTag> s = new ArrayList<>();AssocArray aa;aa = (AssocArray) ps.unserialize(new String("a:3:{i:0;a:2:{s:2:\"id\";i:15;s:3:\"tag\";s:5:\"C/C++\";}i:1;a:2:{s:2:\"id\";i:16;s:3:\"tag\";s:4:\"Java\";}i:2;a:2:{s:2:\"id\";i:18;s:3:\"tag\";s:3:\"PHP\";}}").getBytes());for(int i=0;i<aa.size();i++){s.add((MyTag) Cast.cast(aa.get(i), MyTag.class));}return s;}catch (Exception e){e.printStackTrace();}

4. 总结
可以看到PHPSerializer基本可以满足我们在Java反序列化使用PHP语言序列化的数据结构的需要了。
在PHP里实现AES的加密解密功能(包括mcrypt版本和openssl版本)
使用SMTP协议发送电子邮件
免费看文章,自己学技术
每一篇文章都是福哥一个字一个字地敲出来的,都是福哥原创的。
每一篇文章都是经过了福哥的反复验证的,都是可以正常使用的。










![[网站优化] 使用PHP+Redis实现微博的用户管理视频教程](https://static.kouhao8.com/sucaidashi/xkbb/9faa5be8113c899a3a11e4410dc90a9d.jpg?x-oss-process=image/format,webp/resize,w_88/crop,w_88,h_88,g_nw)
![[网站优化] 使用PHP+Redis实现微博的用户管理视频教程](https://static.kouhao8.com/sucaidashi/xkbb/cd40585dc6146bf1848cbd115437f6ae.jpg?x-oss-process=image/format,webp/resize,w_88/crop,w_88,h_88,g_nw)
![[教程] 量化投资之金融时间序列分析](https://static.kouhao8.com/sucaidashi/xkbb/d3f7ab080c69153bb5a5c56b25426148.jpg?x-oss-process=image/format,webp/resize,w_88/crop,w_88,h_88,g_nw)









![[自动化] 2017 怎么基于python实现接口自动化 视频+文档](https://static.kouhao8.com/sucaidashi/xkbb/8e63050d4d3b2deaddefff89e0a5a66c.jpg?x-oss-process=image/format,webp/resize,w_88/crop,w_88,h_88,g_nw)


![[Python] 四周实现爬虫系统 超经典的Python零基础实战化教学 Python零基础实战课程](https://static.kouhao8.com/sucaidashi/xkbb/570b1b552a766843b416fb28f2752248.jpg?x-oss-process=image/format,webp/resize,w_88/crop,w_88,h_88,g_nw)







相关资源