有谁知道如果它是可能的,实际上如果它已经完成,在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