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

时间:2009-04-13 09:03:31

标签: java php serialization

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

您怎么看?

由于

15 个答案:

答案 0 :(得分:18)

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

答案 1 :(得分:15)

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

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

还有其他一些例如Google Protocol Buffers。

答案 2 :(得分:9)

使用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));

答案 3 :(得分:6)

理论上,这当然是可能的。毕竟它只是字节,可以解析它们。当然,反序列化的对象只包含数据,而不包含任何PHP方法。如果需要,您必须将行为重写为直接与PHP类对应的Java类。

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

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

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

答案 4 :(得分:5)

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

虽然最初基于javascript对象文字表示法, 事实证明,JSON可以方便地在所有类型的系统之间进行轻量级数据传输。

答案 5 :(得分:4)

添加到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`

答案 6 :(得分:3)

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

答案 7 :(得分:2)

我记得Drupal(PHP CMS)的一个片段,需要这个功能。刚刚找到它,所以看看Serialized drupal node objects to java(应该适用于任何PHP序列化对象)。

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

答案 8 :(得分:1)

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

答案 9 :(得分:0)

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

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

答案 10 :(得分:0)

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

答案 11 :(得分:0)

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

答案 12 :(得分: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";}}

字符串标识数据类型,数组长度,数组索引和值,字符串长度......我认为不需要花费太多精力对其进行反向工程并提出自己的解析器。

答案 13 :(得分:0)

您可能也对使用PHP / Java桥接(http://php-java-bridge.sourceforge.net/)感兴趣。它有自己的协议。在他们的网站上说它是快速实现的桥梁。

答案 14 :(得分:0)

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

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