• <nav id="wkkge"><strong id="wkkge"></strong></nav>
  • <menu id="wkkge"></menu>
  • Java面向對象
    Java異常
    Java數組
    Java常用類
    Java集合
    Java IO流
    Java線程
    Java反射
    Socket編程
    Java注解開發
    Java GoF設計模式
    HashMap
    Java內存模型
    Java線性表

    Java對象輸入輸出流

     

     

    對象序列化:把一個對象轉換為01二進制

     

    對象反序列化:把一組01二進制轉換為對象

     

    ObjectOutputStream類可以實現對象序列化, 把對象轉換為01序列保存到文件中

     

    ObejctInputStream類實現對象反序列化,從文件中讀取01序列轉換為對象

     

     

    注意:

     

    對象序列化/反序列化的前提是對象的類必須實現Serializable接口, 該接口是一個標志接口,沒有任何方法,只是告訴編譯器這個類的對象可以序列化。

     

    package com.wkcto.chapter06.objectstream;
    
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectOutputStream;
    import java.io.OutputStream;
    
    /**
     * 使用ObjectOutputStream可以實現對象的序列化, 把對象的01序列保存到文件中
     * 
     * @author 蛙課網
     *
     */
    public class Test01 {
    	public static void main(String[] args) throws IOException {
    		//創建Person對象
    		Person lisi = new Person("lisi", 18);
    		
    		//把lisi對象序列化, 就是把lisi對象保存到文件中
    		OutputStream out = new FileOutputStream("d:/obj.txt");
    		ObjectOutputStream oos = new ObjectOutputStream(out);
    		
    		oos.writeObject(lisi); 		//對象序列化
    		
    		oos.close();
    		
    	}
    }

     

    package com.wkcto.chapter06.objectstream;
    
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.ObjectInputStream;
    
    /**
     * 使用ObjectInputStream類實現對象的反序列化,
     * 		就是從文件中把保存的對象讀取出來
     * 
     * @author 蛙課網
     *
     */
    public class Test02 {
    
    	public static void main(String[] args) throws IOException, ClassNotFoundException {
    		InputStream in = new FileInputStream("d:/obj.txt");
    		ObjectInputStream ois = new ObjectInputStream(in);
    		
    		Object obj = ois.readObject();  	//從文件中讀取一個對象, readObject()方法的返回值是Object類型的
    		//文件中實際存儲的是Person對象, 使用obj引用指向Person對象
    		
    		System.out.println( obj ); 		//實際上調用的是Person對象的toString()方法
    		ois.close();
    		
    		/*
    		 * 在對象序列化之后 ,即把對象已經保存到文件中了,  又在Person類中添加了一個字段,修改了Person類結構,
    		 * 	再進行反序列化時, 出現了異常:
    		 *  java.io.InvalidClassException:
    		 *  	com.wkcto.chapter06.objectstream.Person; local class incompatible: 
    		 * 		stream classdesc serialVersionUID = 3479771803741762411, 
    		 * 		local class serialVersionUID = 1549311491347595402
    		 * 分析原因:
    		 * 		流中類的描述信息中 serialVersionUID的值與本地字節碼文件中 serialVersionUID字段的值不相等引發的異常
    		 * 
    		 * 		當類Person實現了Serializable接口后, 系統會自動的在Person類中增加一個serialVersionUID序列化版本號字段
    		 * 		在lisi對象序列化時, serialVersionUID字段的值是: 3479771803741762411
    		 * 		當序列化后, 又在Person類添加了gender字段, 編譯后,在字節碼文件中重新生成了一個serialVersionUID的值:1549311491347595402
    		 * 		在進行反序列化時, 系統會檢查流中serialVersionUID序列化版本號字段與本地字節碼文件中serialVersionUID字段的值是否一樣
    		 * 			如果相等就認為是同一個類的對象, 如果這個serialVersionUID序列化版本號字段的值不相等,就認為是不同類的對象
    		 * 解決方法:
    		 * 		保證反序列化時流中serialVersionUID字段 的值,與本地字節碼文件中serialVersionUID字段的值相等即可
    		 * 		可以在Person類實現了Serializable接口后, 手動的添加一個serialVersionUID字段 
    		 */
    		
    	}
    
    }

     

    package com.wkcto.chapter06.objectstream;
    
    import java.io.Serializable;
    /**
     * Person類的對象要想序列化, Person類必須實現Serializable接口
     * 		Serializable接口是一個標志接口,沒有任何方法
     * @author 蛙課網
     *
     */
    public class Person implements Serializable{
    	String  name;
    	int age;
    	
    	String gender; 		//性別
    	
    	//手動的添加序列化版本號字段
    	 private static final long serialVersionUID = -1345649873215667710L;
    	
    	
    	@Override
    	public String toString() {
    		return "Person [name=" + name + ", age=" + age + ", gender=" + gender + "]";
    	}
    
    
    	public Person(String name, int age) {
    		super();
    		this.name = name;
    		this.age = age;
    	}
    	
    }

     

    全部教程
  • <nav id="wkkge"><strong id="wkkge"></strong></nav>
  • <menu id="wkkge"></menu>
  • 面对面棋牌游戏