`
bjmike
  • 浏览: 283027 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Hibernate POJO为什么要实现Serializable接口(转)

阅读更多

无意当中想到这个问题,然后google 一下。找到一篇对 serialization 介绍的文章,关于这个问题比较多的人解释是:hibernate有二级缓存,缓存会将对象写进硬盘,就必须序列化,以及兼容对象在网络中的传输 等等...

     目的:将二级缓存中的内容持久化保存下来,便于恢复缓存的信息,hibernate的缓存机制通过使用序列化,断定应该是基于序列化的缓存,如没有serializable接口,在序列化时,使用objectOutputStream的write(object)方法将对象保存到文件时将会出现异常。

java中常见的几个类(如:Interger、String等),都实现了serializable接口

接口 java.io.Serializable

public interface Serializable

实现 java.io.Serializable 接口的类是可序列化的。没有实现此接口的类将不能使它们的任一状态被序列化或逆序列化。序列化类的所有子类本身都是可序列化的。这个序列化接口没有任何方法和域,仅用于标识序列化的语意。

控制序列化的时候还可能会碰到,要禁止Java的序列化机制自动存取某个子对象的情况。这种需求是很常见的,你肯定不会希望把口令之类敏感信息也序列化了。因为一旦序列化了,别人就能通过分析文件和截获网络传输来进行破解,这样即便访问权限是private的也保不住了。.
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。
序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。

序列化:序列化是将对象转换为容易传输的格式的过程。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。在另一端,反序列化将从该流重新构造对象。
是对象永久化的一种机制。

确切的说应该是对象的序列化,一般程序在运行时,产生对象,这些对象随着程序的停止运行而消失,但如果我们想把某些对象(因为是对象,所以有各自不同的特性)保存下来,在程序终止运行后,这些对象仍然存在,可以在程序再次运行时读取这些对象的值,或者在其他程序中利用这些保存下来的对象。这种情况下就要用到对象的序列化。

只有序列化的对象才可以存储在存储设备上。为了对象的序列化而需要继承的接口也只是一个象征性的接口而已,也就是说继承这个接口说明这个对象可以被序列化了,没有其他的目的。之所以需要对象序列化,是因为有时候对象需要在网络上传输,传输的时候需要这种序列化处理,从服务器硬盘上把序列化的对象取出,然后通过网络传到客户端,再由客户端把序列化的对象读入内存,执行相应的处理。

   对象序列化是java的一个特征,通过该特征可以将对象写作一组字节码,当在其他位置读到这些字节码时,可以依此创建一个新的对象,而且新对象的状态与原对象完全相同。为了实现对象序列化,要求必须能够访问类的私有变量,从而保证对象状态能够正确的得以保存和恢复。相应的,对象序列化API能够在对象重建时,将这些值还原给私有的数据成员。这是对java语言访问权限的挑战。通常用在服务器客户端的对象交换上面,另外就是在本机的存储。

对象序列化的最主要的用处就是在传递,和保存对象(object)的时候,保证对象的完整性和可传递性。譬如通过网络传输,或者把一个对象保存成一个文件的时候,要实现序列化接口 。

即使你没有用过对象序列化(serialization),你可能也知道它。但你是否知道 Java 还支持另外一种形式的对象持久化,外部化(externalization)?

下面是序列化和外部化在代码级的关联方式:

public interface Serializable {}

public interface Externalizable extends Serializable {
void readExternal(ObjectInput in);
void writeExternal(ObjectOutput out);
}

比较java.io.Externalizable和java.io.Serializable
序列化和外部化的主要区别

外部化和序列化是实现同一目标的两种不同方法。下面让我们分析一下序列化和外部化之间的主要区别。

通过Serializable接口对对象序列化的支持是内建于核心 API 的,但是java.io.Externalizable的所有实现者必须提供读取和写出的实现。Java 已经具有了对序列化的内建支持,也就是说只要制作自己的类java.io.Serializable,Java 就会试图存储和重组你的对象。如果使用外部化,你就可以选择完全由自己完成读取和写出的工作,Java 对外部化所提供的唯一支持是接口:

voidreadExternal(ObjectInput in)
void writeExternal(ObjectOutput out)

现在如何实现readExternal() 和writeExternal() 就完全看你自己了。

序列化会自动存储必要的信息,用以反序列化被存储的实例,而外部化则只保存被存储的类的标识。当你通过java.io.Serializable接口序列化一个对象时,有关类的信息,比如它的属性和这些属性的类型,都与实例数据一起被存储起来。在选择走Externalizable这条路时,Java 只存储有关每个被存储类型的非常少的信息。

每个接口的优点和缺点

Serializable接口

· 优点:内建支持

· 优点:易于实现

· 缺点:占用空间过大

· 缺点:由于额外的开销导致速度变比较慢

Externalizable接口

· 优点:开销较少(程序员决定存储什么)

· 优点:可能的速度提升

· 缺点:虚拟机不提供任何帮助,也就是说所有的工作都落到了开发人员的肩上。

在两者之间如何选择要根据应用程序的需求来定。Serializable通常是最简单的解决方案,但是它可能会导致出现不可接受的性能问题或空间问题;在出现这些问题的情况下,Externalizable可能是一条可行之路。

要记住一点,如果一个类是可外部化的(Externalizable),那么Externalizable方法将被用于序列化类的实例,即使这个类型提供了Serializable方法:

private void writeObject()
private void readObject()

再补充一点:

equals/hashcode 查看JDK文档,大致是用于你可以自己定义两个对象何时相等(equals)。例如你可以定义身份证相同的两个Person对象是相等的。重载equals同时,必须重写hashCode

Serializable 接口是表明这个对象可以序列化,或者说可以把对象从内存中写入文件,或者通过网络传输。这是EJB规范的要求,保证可以这些对象在网络传输,进行远程调用
重写hashCode是因为,hibernate有自己的hashCode算法,主要是用来区分pojo的各种状态,比如游离态等等。
序列化的接口最好每个pojo都实现,不一定非要复合主键。
分享到:
评论

相关推荐

    hibernate自动生成Pojo

    由于 Hibernate 默认使实体类实现 `java.io.Serializable` 接口,IDE可能会显示黄色感叹号,这是因为缺少泛型参数。你可以右键选择 `Generate` 功能,让IDE自动补全泛型信息,消除警告。 生成的实体类通常包含以下...

    hibernate简介及优缺点

    1.Hibernate持久化类:Hibernate的持久化类是一个JavaBean(pojo+相应属性的getter和setter方法),该JavaBean最好实现java.io.Serializable接口 2.Hibernate映射文件:Hibernate映射文件是Hibernate与数据库进行持久化...

    javaee实验五 大学本科生 hibernate

    这些类需要实现`Serializable`接口,以支持对象的序列化和反序列化。 4. **Hibernate配置文件(hibernate.cfg.xml)**: 这个文件配置了数据库连接信息,包括数据库URL、用户名、密码,以及SessionFactory的配置。...

    Hibernate 参数配置详解

    - **取值**:应设置为数据库对应的 `org.hibernate.dialect.Dialect` 子类的完整类名。 - **示例**:对于 MySQL 数据库,可以设置为 `org.hibernate.dialect.MySQLDialect`。 ##### 2. 显示 SQL 语句 (Show SQL) -...

    Hibernate关键知识点大全

    Hibernate是一款强大的Java持久化框架,它为开发者提供了在关系数据库与对象模型之间进行映射的能力,从而简化了数据访问层的开发。在这个知识点大全中,我们将深入探讨Hibernate的核心概念、配置、映射机制以及常用...

    hibernate的一点总结

    开发过程中,我们需要设计持久化实体类,这些类通常是简单的Java类(POJO),并实现序列化接口`Serializable`。接着,创建对象-关系映射文件(`.hbm.xml`),在这里定义对象与数据库表的映射关系,包括主键生成策略...

    JDBC Hibernate学习笔记

    - 实现Serializable接口。 - 提供对象的ID字段,通常是Long类型。 - 提供getters和setters方法。 - 提供无参构造器,以便通过反射机制创建对象。 ### 总结 通过对JDBC和Hibernate的学习,我们不仅了解了如何...

    hibernate课件

    这类对象具有简单的属性和方法,遵循一定的编码规范,如必须实现Serializable接口,拥有默认构造器,以及提供get和set方法等。 #### 创建配置文件 Hibernate的运行依赖于配置文件,主要包括`Hibernate.cfg.xml`和`...

    Hibernate 与 Lucene 的整合框架详解

    文中提到的 Hibernate Search 版本为 3.0.0.GA。GA (General Availability) 表示该版本已经稳定可用,适合生产环境部署。这个版本支持 Hibernate ORM 3.x 和 Lucene 3.x。 ##### 2. 创建 POJO 类 下面通过一个具体...

    hibernate 详细配置

    3. **序列化接口**:实现`Serializable`接口,以支持序列化操作,这对于Hibernate来说是非常重要的,因为它会在内存中缓存对象的状态。 4. **无参构造器**:默认情况下,Hibernate会寻找一个无参数的构造器来实例化...

    Java应用中使用Hibernate.pdf

    Hibernate要求实体类遵循一定的规范,比如必须实现`Serializable`接口,因为Hibernate在内部会进行序列化操作以支持其二级缓存等机制。实体类通常包含属性,以及对应的getter和setter方法,这符合JavaBean规范。通过...

    Hibernate注解详解

    每个持久化POJO类都是一个实体Bean, 通过在类的定义中使用 @Entity 注解来进行声明。 声明实体Bean @Entity
public class Flight implements Serializable {
 Long id;
 @Id
 public Long getId() { return id;...

    Hibernate 3.x 参考手册

    - 实现序列化接口 `Serializable`。 - 提供无参构造方法。 - 定义私有变量,包括主键。 - 为每个属性提供 getter 和 setter 方法。 **1.3 映射猫类** - **映射文件:** - 创建 `.hbm.xml` 文件用于描述 Java ...

    Hibernate_DEV_GUIDE

    作者强调本文并不是要取代Hibernate官方参考文档,而是旨在为开发者提供一个更加友好的学习路径,帮助他们更好地入门并掌握Hibernate。 #### 二、准备工作 - **下载并配置Ant**:首先需要下载Ant工具包,并将其bin...

    Hibernate 开发学习指导书

    构建Hibernate的基础代码主要包括两部分:POJO类和Hibernate映射文件。 ##### 1. POJO (Plain Ordinary Java Object) POJO是Hibernate中非常重要的概念,它是数据库表在Java中的表示形式。通常来说,POJO就是一个...

    hibernate3.1参考手册中文版.pdf

    - **持久化类**:持久化类是指那些被 Hibernate 映射到数据库表中的 Java 类,它们需要实现 Serializable 接口,并且通常包含有 `id` 属性作为主键。 - **映射文件**:每个持久化类都需要有一个对应的 XML 映射...

    Struts2+Spring+Hibernate集成过程

    1. **开发环境**:在开始集成之前,首先要确保安装了正确的开发工具和技术版本,具体为: - JDK版本:JDK 7 - Web服务器:Tomcat 6 - IDE:MyEclipse 8.0 - Struts2版本:2.1 - Spring版本:3.0 - Hibernate...

    hibernate 开发指南下载

    - **Hibernate映射文件**: 映射文件定义了POJO与数据库表之间的映射关系,通常采用XML格式。 - **格式**: - 文件名通常以`.hbm.xml`结尾。 - 使用特定的XML标签和属性来描述实体类的属性与数据库表字段之间的映射...

Global site tag (gtag.js) - Google Analytics