理解hibernate中持久化和序列化

转载 2015年11月19日 13:15:08
一、什么是序列化
对象的寿命通常随着生成该对象的程序的终止而终止。有时候,可能需要将对象的状态保存下来,在需要时再将对象恢复。我们把对象的这种能记录自己的状态以便将来再生的能力叫作对象的持续性(persistence)。对象通过写出描述自己状态的数值(serialVersionUID)来记录自己 ,这个过程叫对象的串行化(Serialization) 。串行化的主要任务是写出对象实例变量的数值以控制持久化对象的版本。如果该变量是另一对象的引用,则引用的对象也要串行化。这个过程是递归的。
把Java对象转换为字节序列的过程称为对象的序列化。把字节序列恢复为Java对象的过程称为对象的反序列化。 实现java.io.Serializable接口的类对象可以转换成字节流(序列化)或从字节流恢复(饭序列化),不需要在类中增加任何代码。如下图。
深入理解hibernate中持久化和序列化
上图中serialVersionUID的作用是对持久化对象的序列化的版本控制,控制各版本反序列化时是否兼容。Java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应类的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。
serialVersionUID 有两种生成方式: 
1.Add default Serial version ID,默认为1L,比如:private static final long serialVersionUID = 1L;
2.Add generated Serial version ID,根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,比如: private static final long serialVersionUID = 60803763950279619L。
struts架构下的网站经常出现javax.servlet.ServletException: BeanUtils.populate 错误,但是本地运行又一切正常,原因是tomcat把所有类串行化时候,不同项目间很多java类都是互相复制粘贴的,所以导致了很多类的serialVersionUID都是同一个值,所以tomcat会把不同项目的相同类名的类当作同一个类去处理,导致了这个奇怪的错误。 每个项目同名的类serialVersionUID改为不一样就可以解决部署上去的网站报错问题。
二、持久化
序列化是能够实现对象的写入和写出,这样在此基础上,持久化就水到渠成了。持久化是将程序数据在持久状态和瞬时状态间转换的机制。JDBC就是一种持久化机制。文件IO也是一种持久化机制。在一定周期内保持不变就是持久化,持久化是针对时间来说的。持久化就是把内存中的对象保存到外存中,让以后能够取回。而保存和取回的过程就是经过序列化和对象io完成的。
序列化是为了解决对象的传输问题,使对象传输可以在线程之间、进程之间、内存外存之间、主机之间进行。我之所以在这里提到序列化,是因为我们可以利用序列化来辅助持久化。

深入理解hibernate中持久化和序列化

虽然平时经常用hibernate的持久化类DO,但是仅限于随手逆向工程生成相应数据库表的持久化类,然后拿来用,根本就没有深入的去了解hibernate的持久化和类的序列化的具体用法原理。闲来没事查查资...
  • dreamrealised
  • dreamrealised
  • 2013年06月18日 19:11
  • 1965

hibernate中设置字段不持久化 注解

hibernate中Modle中的有些属性不想创建表是在数据库中产生字段保存数据,当这种需求是我们可以设置@transient表示透明的当设置此属性是在创建数据库是可以对此属性忽略,在本例中模拟了一个...
  • zy_281870667
  • zy_281870667
  • 2016年06月01日 11:34
  • 6368

hibernate中如何用Annotion注解设置Modle中的字段不持久化

hibernate中Modle中的有些属性不想创建表是在数据库中产生字段保存数据,当这种需求是我们可以设置@transient表示透明的当设置此属性是在创建数据库是可以对此属性忽略,在本例中模拟了一个...
  • qhs1573
  • qhs1573
  • 2013年09月19日 23:48
  • 11119

深入理解hibernate中持久化和序列化

虽然平时经常用hibernate的持久化类DO,但是仅限于随手逆向工程生成相应数据库表的持久化类,然后拿来用,根本就没有深入的去了解hibernate的持久化和类的序列化的具体用法原理。闲来没事查查资...
  • dreamrealised
  • dreamrealised
  • 2013年06月18日 19:11
  • 1965

Hibernate的相关概念 以及 序列化和持久化的区别

一. Hibernate 初识 hibernate是一种ORM(object relation mapping,对象关系映射)框架,所谓的对象关系映射,通俗的说,就是把JAVA对象保存到关系型数据库中...
  • s1491695565
  • s1491695565
  • 2016年07月23日 11:17
  • 477

序列化与持久化相同点跟不同点

  • 2011年11月08日 12:44
  • 54KB
  • 下载

java 类的序列化和持久化理解

什么是序列化?把Java对象转换为字节序列的过程称为对象的序列化。把字节序列恢复为Java对象的过程称为对象的反序列化。 实现java.io.Serializable接口的类对象可以转换成字节流(序列...
  • qq_21989939
  • qq_21989939
  • 2015年07月27日 16:27
  • 726

java持久化类为什么要实现序列化

之前听老师讲过在Java里面,类有时候要实现序列化,也就是和Serializable接口相关的东西,但感觉当时好抽象忘了,上网上找了好久,看到了一篇博文。 =============...
  • qq_25210899
  • qq_25210899
  • 2016年09月28日 16:26
  • 1502

关于Session(javax.servlet.HttpSession)持久化----为什么实体类需要实现序列化接口

为什么需要持久化?     客户端访问了某个能开启会话功能的资源,web服务器就会创建一个与该客户端对应的HttpSession对象,每个HttpSession对象都要占用一定的内存空间。如果在某一...
  • qq_27069001
  • qq_27069001
  • 2017年04月13日 09:34
  • 683

使用Weka进行数据挖掘(Weka教程九)模型序列化/持久化存储和加载

有很多时候,你在构建了一个模型并完成调优后,你很可能会想把这个模型存入到磁盘中,免得下次再重新训练。尤其是神经网络、SVM等模型训练时间非常长,重新训练非常浪费时间。那么怎么持久化模型呢? 其实既然...
  • qiao1245
  • qiao1245
  • 2016年03月15日 14:42
  • 1904
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:理解hibernate中持久化和序列化
举报原因:
原因补充:

(最多只允许输入30个字)