• 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();
    }
    “`

  • 相关阅读:
    Maven——配置阿里云的镜像仓库
    Eclipse——配置代码提示
    设计模式——一步步实现《单例模式》
    JAVA实现二叉平衡树
    简单设计模式——状态模式 (召唤师峡谷版)
    简单设计模式——观察者模式
    JavaScript获取鼠拖动选中的内容(InMemories笔记)
    图解数据结构——二叉查找树/二叉排序树
    SpringMVC详细笔记(一) —— 几步快速搭建一个SpringMVC程序
    【Java虚拟机10】ClassLoader.getSystemClassLoader()流程简析
  • 原文地址:https://www.cnblogs.com/wangxiaopei/p/8551260.html
Copyright © 2020-2023  润新知