3

我有一个这种格式的 php 数组:

<?php
$value = array("id" => 42, "user" => "superman");
echo serialize($value); 
?>

序列化:

a:2:{s:2:"id";i:42;s:4:"user";s:8:"superman";} 

String我在java中收到这个。我如何在 java 中反序列化这个?我知道implements Serializable在 java 中,但在这种情况下不起作用。

我想以这种格式创建一个对象:

import java.io.Serializable;

public class Serial implements Serializable{
    private int mId;
    private String mUser;

    public Serial(int mId, String mUser) {
        super();
        this.mId = mId;
        this.mUser = mUser;
    }
    public int getId() {
        return mId;
    }
    public void setId(int id) {
        this.mId = id;
    }
    public String getUser() {
        return mUser;
    }
    public void setUser(String user) {
        this.mUser = user;
    }
}

之后,我想再创建一次String从 Java 对象序列化的时间,以便在 PHP 中反序列化;

谢谢你的帮助。

4

2 回答 2

3

您不能用另一种语言本地读取一种语言的序列化对象(每种语言都有自己的序列化协议/格式,不能保证它们可以读取另一种格式),Java 序列化对象被序列化为二进制格式和 PHP 您提供文本格式。

您可以使用诸如Google 的协议缓冲区之类的库,它们不正式支持 PHP,但是有为 PHP提供协议缓冲区支持的3rd 方库。

协议缓冲区是 Google 的语言中立平台中立、可扩展的结构化数据序列化机制——想想 XML,但更小、更快、更简单。您只需定义一次数据的结构化方式,然后就可以使用特殊生成的源代码轻松地在各种数据流中写入和读取结构化数据,并使用各种语言(Java、C++ 或 Python)。

如果您不喜欢这样,您将需要开发自己的协议来将 PHP 序列化对象读取到 Java 对象中,您可以使用修改后的 JSON 库来执行此操作,因为我不相信s:2:"id";从您的示例序列化对象是有效的 JSON。存在一个使用 Java 执行此操作的,但是 PHP 序列化格式不是“安全”的,因为它可以包含空值,所以我建议不要这样做。

于 2013-08-07T13:12:33.780 回答
2

对你来说有点晚了,但可能对其他人(包括我)有用:

你可以检查这个问题,它有很多答案。对于那些没有时间阅读的人,这里是它指向的主要链接:

1- PHP 反序列化的静态类

2- Pherialize 类及其附属类

正如@Robadob(和所有开发人员)所说,做这种工作最可靠的方法是使用标准格式。

于 2015-03-10T19:25:05.490 回答