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

17

有没有人知道在 PHP 中序列化一个对象并在 Java 中反序列化(即实现 Java-PHP 通信)是否可行,是否已经实现过了?也许需要一个适配器。

你认为呢?

谢谢。

15个回答

18

有一个名为serialized-php-parser的工具,它是一种Java实现,可以解析php序列化对象。总的来说,如果有选择的话,我不推荐使用php序列化作为交换格式,因为它不是ascii安全的(它包含空字节)。相反,建议使用像xml或json这样的格式。如果需要一些类型信息,xmlrpc 是一个不错的选择,它在php和Java两种语言中都有良好的实现。


15

PHP和Java都使用它们自己的(显然不同的)序列化方案。但你可以使用一种可读写的交换格式。

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

还有其他的格式,比如Google Protocol Buffers。


13
另一个可用于处理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));

6
理论上来说,这是完全可能的。毕竟它只是字节,可以被解析。当然,反序列化的对象只包含数据,而没有任何PHP方法。如果你想要那些方法,你需要将行为重写为与PHP类直接对应的Java类。
实际上,主要问题似乎是PHP序列化格式似乎没有正式规定-至少在手册中没有链接到规范。
因此,您可能需要深入代码以了解格式。
总之,使用类似XML序列化的东西会更容易和更稳定-我相信两种语言都有可以简化这一过程的库。

5

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

虽然最初基于JavaScript对象文字符号,但JSON在各种类型系统之间进行轻量级数据传输方面证明了其便利性。


当然可以,但它在传输原始类型方面表现良好,并且得到大多数编程语言的支持。 - Matt
json.org列出了35种具有实现的语言,因此我认为它并不是专门为Javascript设计的。 - zimbu668

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`

3
你可以使用PHP的var_export()函数来实现此功能,该函数返回要序列化的对象的可解析字符串表示形式。

2

我记得在Drupal(PHP CMS)中需要这种功能的代码片段。我找到了它,你可以看一下Serialized drupal node objects to java(应该适用于任何PHP序列化对象)。

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


1
在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";}}

字符串标识数据类型、数组长度、数组索引和值、字符串长度等。我认为反向工程并编写自己的解析器不需要太多的努力。

1

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

如果没有选择,我一直在开发一个Jackson Module,以便从Java读取和写入序列化的PHP。Jackson是一个很棒的JSON解析器,由于PHP序列化格式非常相似,因此它似乎很合适。它还不完整(编写仍在进行中)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接