理解java中的序列化与反序列化

涉及的JDK API:

ObjectOutputStream()  writeObject(obj)  序列化

ObjectInputStream()  readObject()   反序列化

默认的序列化方式:实现Serializable接口

序列化:

定义:将对象及其信息转换为可存储或者传输形式的过程。

常见形式:序列化为文件,序列化为字节流等

作用:易于网络上传输或者存储到硬盘

代码示例:

@org.junit.Test
    public void test5(){
        ObjectOutputStream stream=null;
        try {//序列化到d:/a.obj
            stream = new ObjectOutputStream(new FileOutputStream("d:/a.obj"));
            Per per = new Per();
            stream.writeObject(per);
            stream.close();
        } catch (FileNotFoundException e) {
        } catch (IOException e) {
        } 
    }

反序列化:

定义:将其他信息还原为java对象的过程。

代码示例:

@org.junit.Test
    public void test6(){
        ObjectInputStream ins=null;
        try {//反序列化
            ins=new  ObjectInputStream(new FileInputStream("d:/a.obj"));
        } catch (FileNotFoundException e) {
        } catch (IOException e) {
        }
        try {
            Per p=(Per)ins.readObject();
            System.out.println(p);
        } catch (IOException e) {
        } catch (ClassNotFoundException e) {
        }
    }

注意:

只有实现了Serializable接口或者Externalizable接口的类的对象才会被序列化。

静态的变量不会被序列化:因为静态变量属于类级别的。可能有时候实验会发现似乎也被序列化了,那是个假象,因为有可能是把序列化的过程和反序列化的过程写在了一个方法里,那么那个具有静态变量的类还是加载了的,所以。。

使用transient修饰的变量不会被序列化。

默认的反序列化不会调用任何的构造方法

控制序列化与反序列化,可以再类中写

private void writeObject(java.io.ObjectOutputStream out) throws IOException

private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException;

作用是:比如序列化是有些内容较敏感,可以再writeObject中进行处理。。。。

 

完全由类来控制序列化与反序列化:实现Externalizable接口

void writeExternal(ObjectOutput out) throws IOException

void readExternal(ObjectInput in) throws IOException , ClassNotFoundException

注意:此中方式反序列化时,会先调用类的不带参数的构造方法,如果没有了或者级别不正确,则会报错。

 

可序列化类的不同版本的序列化兼容性问题:

显示的定义serialVersionUID,带来的好处:

1 在某些场合,希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有相同的serialVersionUID

2)在某些场合,不希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有不同的serialVersionUID

 

http://www.2cto.com/kf/201312/264301.html

你可能感兴趣的:(理解java中的序列化与反序列化)