什么是序列化
就是可以将一个对象(标志对象的类型)及其状态转换为字节码,保存起来(可以保存在数据库,内存,文件等),然后可以在适当的时候再将其状态恢复(也就是反序列化)。serialization 不但可以在本机做,而且可以经由网络操作。它自动屏蔽了操作系统的差异,字节顺序等。比如,在 Windows 平台生成一个对象并序列化之,然后通过网络传到一台 Unix 机器上,然后可以在这台Unix机器上正确地重构(deserialization)这个对象。 不必关心数据在不同机器上如何表示,也不必关心字节的顺序或者其他任何细节。
另外,还应明白以下几点:
a. java.io.Serializable接口没有任何方法属性域,实现它的类只是从语义上表明自己是可以序列化的。
b. 在对一个 Serializable(可序列化)对象进行重新装配的过程中,不会调用任何构建器(甚至默认构建器)。整个对象都是通过从 InputStream 中取得数据恢复的。
c. 如是要一个类是可序列化的,那么它的子类也是可序列化的
package hibernate.belle;
import java.util.Date;
public class Fiscal {
private FiscalPK fiscalpk;
private Date date;
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public FiscalPK getFiscalpk() {
return fiscalpk;
}
public void setFiscalpk(FiscalPK fiscalpk) {
this.fiscalpk = fiscalpk;
}
}
package hibernate.belle;
import java.io.Serializable;
public class FiscalPK implements Serializable{
private int fiscalYear;
private int fiscalMonth;
public int getFiscalYear() {
return fiscalYear;
}
public void setFiscalYear(int fiscalYear) {
this.fiscalYear = fiscalYear;
}
public int getFiscalMonth() {
return fiscalMonth;
}
public void setFiscalMonth(int fiscalMonth) {
this.fiscalMonth = fiscalMonth;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + fiscalMonth;
result = prime * result + fiscalYear;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
FiscalPK other = (FiscalPK) obj;
if (fiscalMonth != other.fiscalMonth)
return false;
if (fiscalYear != other.fiscalYear)
return false;
return true;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping >
<class name="hibernate.belle.Fiscal" table="fiscal" >
<composite-id name="fiscalpk">
<key-property name="fiscalYear"></key-property>
<key-property name="fiscalMonth"></key-property>
</composite-id>
<property name="date"> </property>
</class>
</hibernate-mapping>
package hibernate_manytomany;
import java.util.Date;
import org.hibernate.Session;
import hibernate.belle.Fiscal;
import hibernate.belle.FiscalPK;
import hibernate.belle.HibernateUtils;
import junit.framework.TestCase;
public class Extends extends TestCase{
public void teststore(){
Session session=null;
try{
session=HibernateUtils.getSession();
session.beginTransaction();
Fiscal fis=new Fiscal();
FiscalPK pk=new FiscalPK();
pk.setFiscalYear(2009);
pk.setFiscalMonth(9);
fis.setFiscalpk(pk);
fis.setDate(new Date());
session.save(fis);
session.beginTransaction().commit();
}catch(Exception e)
{
e.printStackTrace();
session.beginTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
}
public void testload(){
Session session=null;
try{
session=HibernateUtils.getSession();
session.beginTransaction();
Fiscal fis=new Fiscal();
FiscalPK pk=new FiscalPK();
pk.setFiscalMonth(9);
pk.setFiscalYear(2009);
fis=(Fiscal)session.load(Fiscal.class, pk);
System.out.println(fis.getDate());
session.beginTransaction().commit();
}catch(Exception e)
{
e.printStackTrace();
session.beginTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
}
}