php常用數組函數和用法「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();
}
使用Java實現PHP的序列化和反序列化函數serialize和unserialize

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();
}
使用Java實現PHP的序列化和反序列化函數serialize和unserialize

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();
}
使用Java實現PHP的序列化和反序列化函數serialize和unserialize

4. 總結

可以看到PHPSerializer基本可以滿足我們在Java反序列化使用PHP語言序列化的數據結構的需要了。

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/253403.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-14 02:27
下一篇 2024-12-14 02:28

相關推薦

發表回復

登錄後才能評論