什么是序列化及其工作原理

时间:2010-06-07 09:39:30

标签: java serialization

  

可能重复:
  Why Java needs Serializable interface?

我知道序列化过程但没有实现它。

在我的应用程序中,我已经看到有各种类已经实现了可用于serilizable的接口。考虑下面的课程

public class DBAccessRequest
implements Serializable
{
    private ActiveRequest request = null;
    private Connection connection = null;
    private static Log log = LogFactory.getLog(DBAccessRequest.class);

    public DBAccessRequest(ActiveRequest request,Connection connection)
    {        
        this.request = request;
        this.connection = connection;
    }

    /**
     * @return Returns the DB Connection object.
     */
    public Connection getConnection() {
        return connection;
    }

    /**
     * @return Returns the active request object for the db connection.
     */
    public ActiveRequest getRequest() {
        return request;
    }
}

只需在构造函数中设置请求和连接,并为它们设置getter setter。 那么在这里有什么可用于可服用的实施...

5 个答案:

答案 0 :(得分:1)

这就是所谓的标记接口;它用于定义可在Java中序列化的类型。来自API:

  

java.io.Serializable:实现[this]接口的类启用了类的可序列化。未实现此接口的类将不会将其任何状态序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。序列化接口没有方法或字段,仅用于标识可序列化的语义。

另见:

答案 1 :(得分:1)

Layman会说:“Serializable?它是如何告诉Java的,我需要将这个对象分解为字节并安全地存储在其他地方,反之亦然”

答案 2 :(得分:1)

序列化比这更复杂,如果您曾尝试将一些本地变量(如int,long等)保存到流中,那么您可以直接调用它们。

int i=100;
stream.write(i);

关于序列化的事情,每个Serializable对象都有一个 serialVersionUID ,它是唯一到每个可序列化的对象,并通过 reflection + a非常复杂的mechanizem(以防止再次保存对象的相同实例)它会分解对象并将其保存为字节,就像我的例子一样,只有预定义的非常通用的机械化来完成它

这意味着,在您的示例中,它将查看 DBAccessRequest 对象检查哪个变量存在以及它们是否也是Serializable它会对它们执行相同的过程,并将它们切换到 Serializable 核心,并将它们保存为字节。

这是解释一个非常复杂,非常有趣且值得研究的过程的一般概念的所有隐喻(你应该查一下):

How Serialization works1

How Serialization works2

希望得到这个帮助,

亚当。

答案 3 :(得分:0)

来自Sun

  

我们都知道Java平台允许   我们在中创建可重用的对象   记忆。但是,所有这些对象   只有Java虚拟存在才存在   machine1仍在运行。这将是   如果我们创建的对象可以   超出了生命的存在   虚拟机,不是吗?好,   使用对象序列化,您可以   展平你的物品并重复使用它们   有力的方式。

所以我认为将其标记为可序列化的原因是,一旦JVM重新启动并运行,之前使用的数据将被加载并再次使用。这可能很有用,以避免用户在每次加载应用程序时都输入相同的数据。

答案 4 :(得分:0)

Rozer,我想你的意思是为什么这个类被标记为Serializable,除了getter和setter之外没有任何与序列化相关的功能。

该类可能无法直接实现可序列化函数。

  1. 派生DBAccessRequest类的类可能会实现它们;或
  2. 可能需要序列化具有DBAccessRequest实例的类,这需要DBAccessRequest可序列化。
  3. 我对此没有任何其他解释。