2009-04-13 224 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`