transient关键字及Serializable的序列化与反序列化

java中的Serializable提供一种持久化机制,将实现了Serializable接口的对象序列化为字节序列,并在以后可以将此字节序列恢复为java对象。
序列化实现了数据的持久化,保存在硬盘中,并且在网络上进行字节序列的传送。
    transient:在序列化时,若字段定义为transient,则会自动对该字段不进行序列化。不让序列化机制进行自动保存与恢复,则加上transient
举例说明:
package day01; 

import java.io.Serializable;
import java.util.Date;

/** 
 * @author wangpei 
 * @version 
 *创建时间:2017年1月17日 下午7:39:15 
 * 练习序列化
 */
public class xuliehua implements Serializable {
    private  Date nowtime=new Date();
    private String uid;
    private transient String pswd;
    xuliehua(String uid,String pswd ){
        this.uid=uid;
        this.pswd=pswd;

    }
    public String toString(){
        String password=null;
        if(pswd==null)
            password="没有值";
        else
            password=pswd;
        return "nowtime="+nowtime+"uid="+uid+"pswd="+password;

    }

package day01; 

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

/** 
 * @author wangpei 
 * @version 
 *创建时间:2017年1月17日 下午7:48:12 
 * 
 */
public class test {

    public static void main(String[] args) {
        xuliehua m=new xuliehua("xiaozhang","123" );
        ObjectOutputStream o;
        //序列化
        try {
            o = new ObjectOutputStream(   
                    new FileOutputStream("logInfo.out"));
            o.writeObject(m);   
            o.close(); 
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } 
        //反序列化  
        try  
        {   
           ObjectInputStream in =new ObjectInputStream(   
                        new FileInputStream("logInfo.out"));   
           xuliehua logInfo = (xuliehua)in.readObject();   
           System.out.println(logInfo.toString());   
        }   
        catch(Exception e) {//deal with exception}   
    }
    }



}

执行后:
nowtime=Tue Jan 17 20:21:17 CST 2017uid=xiaozhangpswd=没有值


注意:在对字节序列进行反序列化的过程中,没有调用任何的构造器,包括默认的构造器,整个对象都是通过从InputStream 中去得数据而进行恢复的。举例:

package day01;

import java.io.Serializable;
import java.util.Date;

/**
* @author wangpei
* @version
*创建时间:2017年1月17日 下午7:39:15
* 练习序列化
*/
public class xuliehua implements Serializable {
private Date nowtime=new Date();
private String uid;
private transient String pswd;
xuliehua( ){
this.uid=”xiaozhang”;
this.pswd=”123”;

}
public String toString(){
    String password=null;
    if(pswd==null)
        password="没有值";
    else
        password=pswd;
    return "nowtime="+nowtime+"uid="+uid+"pswd="+password;

}

}

package day01;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

/**
* @author wangpei
* @version
*创建时间:2017年1月17日 下午7:48:12
*
*/
public class test {

public static void main(String[] args) {
    xuliehua m=new xuliehua();
    ObjectOutputStream o;
    try {
        o = new ObjectOutputStream(   
                new FileOutputStream("logInfo.out"));
        o.writeObject(m);   
        o.close(); 
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }   
    try  
    {   
       ObjectInputStream in =new ObjectInputStream(   
                    new FileInputStream("logInfo.out"));   
       xuliehua logInfo = (xuliehua)in.readObject();   
       System.out.println(logInfo.toString());   
    }   
    catch(Exception e) {//deal with exception}   
}
}

}

结果:

nowtime=Tue Jan 17 20:29:27 CST 2017uid=xiaozhangpswd=没有值

分析pswd仍然是空值,即使在构造方法中已经对其进行了初始化,但是在恢复的过程中只是调用了序列化后的InputStream中的值,而序列化后的pswd为空值,反序列化也为空。
    要序列化一个对象,首先,创建某些OutputStream(例如:FileOutputStream)对象,然后将其封装在ObjectOutputStream对象中,然后调用,writeObject方法,并将其发送给OutputStream,即可进行序列化,反序列化基本相同只不过是读出。
    代码:

try {
o = new ObjectOutputStream(
new FileOutputStream(“logInfo.out”));
o.writeObject(m);
o.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
“`

原文地址:https://www.cnblogs.com/wangxiaopei/p/8551260.html