欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

php数组序列化函数(php常用数组函数和用法)

程序员文章站 2023-11-21 13:05:10
1. 介绍1.1 介绍福哥最近在把一部分功能从php转入java里面,在处理php的序列化(serialize)数据的时候遇到了问题,经过一番折腾找到了一个在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();
}
php数组序列化函数(php常用数组函数和用法)

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();
}
php数组序列化函数(php常用数组函数和用法)

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();
}
php数组序列化函数(php常用数组函数和用法)

4. 总结

可以看到phpserializer基本可以满足我们在java反序列化使用php语言序列化的数据结构的需要了。