有誰知道如果它是可能的,實際上如果它已經完成,在PHP中序列化一個對象並在Java(java-php通信)中反序列化它。可能需要一個適配器。在Java中反序列化一個序列化的php對象
您認爲如何?
謝謝
有誰知道如果它是可能的,實際上如果它已經完成,在PHP中序列化一個對象並在Java(java-php通信)中反序列化它。可能需要一個適配器。在Java中反序列化一個序列化的php對象
您認爲如何?
謝謝
理論上,這當然是可能的。它畢竟只是字節,並且可以被解析。當然,反序列化的對象只包含數據,而不包含任何PHP方法。如果你想這樣做,你必須將行爲改寫爲直接與PHP類對應的Java類。
實際上,主要的問題似乎是PHP序列化格式似乎沒有正式規定 - 至少沒有鏈接到the manual中的規範。
因此,您可能需要深入瞭解代碼以瞭解格式。總而言之,聽起來像使用XML序列化之類的東西會容易得多,也更穩定 - 我相信這兩種語言都有圖書館來支持這一點。
請注意,有一個Java implementation of PHP。所以你可能能夠序列化對象並將它傳遞給你的Java-PHP實例,反序列化,然後調用你的Java基礎結構。
這一切聽起來有點邪惡的混亂,但也許值得一看!
您可以通過某種方式利用PHP的var_export()函數來返回您想要序列化的對象的可解析字符串表示形式。
PHP和Java都使用自己的(明顯不同的)序列化方案。但是,您可以使用可以讀取和寫入的交換格式。
兩個最明顯的例子是XML和JSON。
然而,還有其他人,如谷歌協議緩衝區。
嘗試xstream(將Java對象轉換爲可讀的XML)以序列化,然後編寫自己的PHP代碼進行反序列化。
使用Web服務(REST,RPC,SOAP)或任何其他存儲純文本的解決方案,這些解決方案將允許您從Java讀取/重建數據。
我記得Drupal(PHP CMS)的一個片段,需要這個功能。剛剛找到它,所以看看Serialized drupal node objects to java(應該適用於任何PHP序列化對象)。
也許你可以使用它。我不知道新版本的PHP是否有問題。
在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";}}
的字符串標識數據類型,數組長度,數組索引和值,字符串長度......會不會耗費太多精力進行逆向工程,並拿出用你自己的解析器,我想。
您可能也有興趣使用PHP/Java橋(http://php-java-bridge.sourceforge.net/)。它有自己的協議。在他們的網站上說,它是橋樑的快速實施。
有serialized-php-parser
,這是一個可以解析php序列化對象的Java實現。一般來說,如果你有選擇,我不會推薦php-serialized作爲交換格式,因爲它不是ascii-safe(它包含空字節)。改爲使用xml或json等格式。如果您需要一些類型信息,xmlrpc是一個不錯的選擇。它對於PHP和Java都有很好的實現。
使用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));
像以前的答案已經提到的,我會避免PHP對象序列化如果可能的話。使用JSON(實際上它比PHP中的serialize()快),節儉或其他更普遍的格式。
如果您別無選擇,我一直致力於Jackson Module以支持從Java讀取和寫入序列化的PHP。 Jackson是一個出色的JSON解析器,由於PHP序列化格式非常相似,所以它看起來很合適。它還不完整(寫作仍在進行中)。
一個更好的選擇是解析PHP序列化字符串JSONArray,該回購協議(https://github.com/superalsrk/PhpSerialization)可以幫助你
添加到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`
當然,但它可以很好地傳輸原始類型,並且受到大多數語言的支持。 – Matt 2009-04-13 14:14:13