网站首页 > java教程 正文
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 实体对象
@Data
public 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 实体对象
@Data
public 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语言序列化的数据结构的需要了。
https://m.tongfu.net/home/35/blog/512939.html
猜你喜欢
- 2024-11-04 快速处理Kafka反序列化错误(kafka自定义反序列化)
- 2024-11-04 又一个反序列化漏洞,我服了...(反序列化漏洞修复方案)
- 2024-11-04 Java代码示例:如何使用 serialVersionUID处理序列化
- 2024-11-04 Java 序列化机制(java序列化过程)
- 2024-11-04 SpringBoot整合Grpc实现跨语言RPC通讯
- 2024-11-04 php和java及python3.10的序列化和反序列化
- 2024-11-04 Java修炼终极指南:133 避免在反序列化时发生DoS攻击
- 2024-11-04 聊聊fastjson反序列化的那些坑(fastjson反序列化原理)
- 2024-11-04 Java序列化 3 连问,这太难了吧(在线序列化工具)
- 2024-11-04 避免使用Java序列化(serializable 防止序列化)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)