在Java中反序列化一个序列化的php对象

有没有人知道是否有可能,实际上如果已经完成,在PHP中序列化一个对象并在Java中进行反序列化(java-php通信)。 也许需要一个适配器。

你怎么看?

谢谢

serialized-php-parser ,它是一个可以解析php序列化对象的Java实现。 一般来说,如果您有选择,我不建议使用php-serialized作为交换格式,因为它不是ascii-safe(它包含空字节)。 改为使用xml或json等格式。 如果您需要一些类型信息, xmlrpc是一个不错的选择。 它有很好的php和Java实现。

PHP和Java都使用自己的(明显不同的)序列化方案。 但是,您可以使用可以读写的交换格式。

最明显的两个例子是XML和JSON。

还有其他一些如Google Protocol Buffers。

另一个使用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方法。 如果需要,您必须将行为重写为直接与PHP类对应的Java类。

在实践中,主要问题似乎是PHP序列化格式似乎没有正式指定 – 至少没有链接到手册中的规范。

因此,您可能需要深入了解代码以了解格式。

总而言之,使用像XML序列化这样的东西听起来会更容易和更稳定 – 我确信这两种语言都有可以实现这一目标的库。

JSON格式是一个很好的起点。 有Java , PHP和许多其他语言的实现。

虽然最初基于javascript对象文字表示法,但JSONcertificate了在所有类型的系统之间轻量级数据传输的便利性。

添加到pom.xml中

  de.ailis.pherialize pherialize 1.2.1  

然后在代码中使用

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

您可以以某种方式使用PHP的var_export()函数,它返回您要序列化的对象的可解析字符串表示forms。

我记得Drupal(PHP CMS)的一个片段,需要这个function。 刚刚找到它,所以看看Serialized drupal节点对象到java (应该使用任何PHP序列化对象)。

也许你可以使用它。 我不知道PHP的新版本是否存在问题。

请注意,有一个PHP的Java实现 。 因此,您可以序列化对象并将其传递给Java-PHP实例,反序列化,然后调用Java基础结构。

这听起来有点混乱,但也许值得一看!

使用Web服务(REST,RPC,SOAP)或存储纯文本的任何其他解决方案,允许您从Java读取/重建数据。

在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/ )感兴趣。 它有自己的协议。 在他们的网站上说它是快速实现的桥梁。

像之前的答案一样,如果可能的话,我会避免使用PHP对象序列化。 使用JSON(实际上比PHP中的serialize()更快),thrift或其他更通用的格式。

如果您别无选择,我一直在研究Jackson Module ,以便从Java读取和编写序列化PHP。 Jackson是一个很棒的JSON解析器,因为PHP序列化格式非常相似,所以看起来非常合适。 它还不完整(写作仍在进行中)。

尝试使用xstream (将Java对象转换为可读的XML)来序列化,然后编写自己的PHP代码以反序列化。

更好的选择是将php序列化字符串解析为JSONArray,这个repo( https://github.com/superalsrk/PhpSerialization )可以帮到你