2009-04-13 305 views

回答

4

理論上,這當然是可能的。它畢竟只是字節,並且可以被解析。當然,反序列化的對象只包含數據,而不包含任何PHP方法。如果你想這樣做,你必須將行爲改寫爲直接與PHP類對應的Java類。

實際上,主要的問題似乎是PHP序列化格式似乎沒有正式規定 - 至少沒有鏈接到the manual中的規範。

因此,您可能需要深入瞭解代碼以瞭解格式。總而言之,聽起來像使用XML序列化之類的東西會容易得多,也更穩定 - 我相信這兩種語言都有圖書館來支持這一點。

0

請注意,有一個Java implementation of PHP。所以你可能能夠序列化對象並將它傳遞給你的Java-PHP實例,反序列化,然後調用你的Java基礎結構。

這一切聽起來有點邪惡的混亂,但也許值得一看!

2

您可以通過某種方式利用PHP的var_export()函數來返回您想要序列化的對象的可解析字符串表示形式。

14

PHP和Java都使用自己的(明顯不同的)序列化方案。但是,您可以使用可以讀取和寫入的交換格式。

兩個最明顯的例子是XML和JSON。

然而,還有其他人,如谷歌協議緩衝區。

0

嘗試xstream(將Java對象轉換爲可讀的XML)以序列化,然後編寫自己的PHP代碼進行反序列化。

0

使用Web服務(REST,RPC,SOAP)或任何其他存儲純文本的解決方案,這些解決方案將允許您從Java讀取/重建數據。

1

我記得Drupal(PHP CMS)的一個片段,需要這個功能。剛剛找到它,所以看看Serialized drupal node objects to java(應該適用於任何PHP序列化對象)。

也許你可以使用它。我不知道新版本的PHP是否有問題。

3

格式JSON將是一個很好的開始。有JavaPHP和許多其他語言的實現。

雖然最初基於javascript對象文字符號,但是對於所有類型的系統之間的輕量級數據傳輸來說,JSON證明很方便。

+0

當然,但它可以很好地傳輸原始類型,並且受到大多數語言的支持。 – Matt 2009-04-13 14:14:13

0

在PHP中序列化對象將轉儲對象屬性。由此產生的字符串並不複雜。

echo serialize(
    array(1, null, "mystring", array("key"=>"value")) 
); 

結果:

a:4:{i:0;i:1;i:1;N;i:2;s:8:"mystring";i:3;a:1:{s:3:"key";s:5:"value";}} 

的字符串標識數據類型,數組長度,數組索引和值,字符串長度......會不會耗費太多精力進行逆向工程,並拿出用你自己的解析器,我想。

16

serialized-php-parser,這是一個可以解析php序列化對象的Java實現。一般來說,如果你有選擇,我不會推薦php-serialized作爲交換格式,因爲它不是ascii-safe(它包含空字節)。改爲使用xml或json等格式。如果您需要一些類型信息,xmlrpc是一個不錯的選擇。它對於PHP和Java都有很好的實現。

7

使用PHP序列化格式的另一個Java項目是Pherialize

比方說,你是序列化一個這樣的數組:

array(3) { 
    [0]=> 
    string(8) "A string" 
    [1]=> 
    int(12345) 
    [2]=> 
    bool(true) 
} 

然後你可以用Pherialize反序列化它在Java中是這樣的:

MixedArray list = Pherialize.unserialize(data).toArray(); 
System.out.println("Item 1: " + list.getString(0)); 
System.out.println("Item 2: " + list.getInteger(1)); 
System.out.println("Item 3: " + list.getBoolean(2)); 
0

像以前的答案已經提到的,我會避免PHP對象序列化如果可能的話。使用JSON(實際上它比PHP中的serialize()快),節儉或其他更普遍的格式。

如果您別無選擇,我一直致力於Jackson Module以支持從Java讀取和寫入序列化的PHP。 Jackson是一個出色的JSON解析器,由於PHP序列化格式非常相似,所以它看起來很合適。它還不完整(寫作仍在進行中)。

3

添加到pom.xml的

<dependency> 
    <groupId>de.ailis.pherialize</groupId> 
    <artifactId>pherialize</artifactId> 
    <version>1.2.1</version> 
</dependency> 

然後在代碼中使用

MixedArray list = Pherialize.unserialize(data).toArray(); // data is string `enter code here` 
相關問題