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語言序列化的數據結構的需要了。
版權聲明:本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發現本站有涉嫌抄襲侵權/違法違規的內容, 請發送郵件至 舉報,一經查實,本站將立刻刪除。
發表評論
請登錄后評論...
登錄后才能評論