手记

序列化和反序列化

(一)序列化  ObjectOutputStream

1.序列化

把对象以数据流的形式存储在介质上的过程就是序列化,对象不会随着虚拟机或者程序退出而消失掉


2.结构

java.lang.Object

  继承者 java.io.OutputStream

      继承者 java.io.ObjectOutputStream


3.构造方法

new ObjectOutputStream(OutputStream out) 

OutputStream out : 使用的是字节流

new ObjectOutputStream(new FileOutputStream("E:/obj.txt"));


4.方法

writeObject(Object obj) 将指定的对象写入 ObjectOutputStream


5.实际使用

(1)如果想序列化User类对象,那么User类必须实现"序列化接口(Serializable)"

(2)给类生成一个指定的序列化版本ID,如果这个类的内容发生了变化,不会影响反序列化

   private static final long serialVersionUID = -4743372914435189725L;

(3)多个User对象写入ArrayList集合中,再执行序列化,ArrayList也实现了Serializable接口


(二)反序列化  ObjectInputStream

1.反序列化

ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化


2.结构

java.lang.Object

  继承者 java.io.InputStream

      继承者 java.io.ObjectInputStream


3.构造方法

new ObjectInputStream(InputStream in)创建从指定 InputStream 读取的 ObjectInputStream。

InputStream in : 使用的是字节流

new ObjectInputStream(new FileInputStream("E:/obj.txt"));


4.方法

readObject() 从 ObjectInputStream 读取对象==》返回 Object


5.实际使用

反序列化User类对象,如果User类(修改原有内容)新加个方法,那么反序列化时的序列号(版本号)跟之前序列化时的版本号对应不上,就无法反序列化


代码1:User类

import java.io.Serializable;public class User implements Serializable{	/**	 * 给类生成一个指定的序列化版本ID,如果这个类的内容发生了变化,不会影响反序列化	 */	private static final long serialVersionUID = -4743372914435189725L;		private String name;	private int    age ;		public String getName() {		return name;	}	public void setName(String name) {		this.name = name;	}	public int getAge() {		return age;	}	public void setAge(int age) {		this.age = age;	}	}


代码2:单个User对象序列化

import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;public class Main_ObjectOutputStream {	public static void main(String[] args) {		writeObject();		readObject();	}		// 单个User对象序列化	public static void writeObject() {		ObjectOutputStream oos=null;		try {			oos=new ObjectOutputStream(new FileOutputStream("E:/obj.txt"));			User user=new User();			user.setName("www");			user.setAge(20);						oos.writeObject(user);			/**			 * 文件写入内容			 * ooxxnulloppxxxj <瞎写和乱码因为这里的文件不需要我们去读懂>			 * */		} catch (FileNotFoundException e) {			System.out.println("【异常】未找到文件");			e.printStackTrace();		} catch (IOException e) {			System.out.println("【异常】IO出错");			e.printStackTrace();		} finally {			if(oos!=null) {				try {					oos.close();				} catch (IOException e) {					e.printStackTrace();				}			}		}		System.out.println("end");	}		public static void readObject() {		ObjectInputStream ois=null;		try {			ois=new ObjectInputStream(new FileInputStream("E:/obj.txt"));						Object obj=ois.readObject();			User user=(User) obj;			String name=user.getName();			int    age =user.getAge() ;			System.out.println(name+":"+age);			/**			 * 输出内容 : 			 * www:20			 * */		} catch (FileNotFoundException e) {			System.out.println("【异常】未找到文件");			e.printStackTrace();		} catch (IOException e) {			System.out.println("【异常】IO出错");			e.printStackTrace();		} catch (ClassNotFoundException e) {			System.out.println("【异常】未找到类异常");			e.printStackTrace();		} finally {			if(ois!=null) {				try {					ois.close();				} catch (IOException e) {					e.printStackTrace();				}			}		}		System.out.println("end");	}}


代码3:多个User对象写入集合中,再执行序列化

import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.util.ArrayList;public class Main_ObjectOutputStream_ArrayList {		public static void main(String[] args) {		writeObject();		readObject();	}		// 多个User对象写入集合中,再执行序列化	public static void writeObject() {		ObjectOutputStream oos=null;		try {			oos=new ObjectOutputStream(new FileOutputStream("E:/obj_list.txt"));			User user1=new User();			user1.setName("www");			user1.setAge(20);			User user2=new User();			user2.setName("yyy");			user2.setAge(30);						ArrayList<User> list=new ArrayList<User>();			list.add(user1);			list.add(user2);						oos.writeObject(list);			/**			 * 文件写入内容			 * ooxxnulloppxxxj <瞎写和乱码因为这里的文件不需要我们去读懂>			 * */		} catch (FileNotFoundException e) {			System.out.println("【异常】未找到文件");			e.printStackTrace();		} catch (IOException e) {			System.out.println("【异常】IO出错");			e.printStackTrace();		} finally {			if(oos!=null) {				try {					oos.close();				} catch (IOException e) {					e.printStackTrace();				}			}		}		System.out.println("end");	}		public static void readObject() {		ObjectInputStream ois=null;		try {			ois=new ObjectInputStream(new FileInputStream("E:/obj_list.txt"));			Object obj=ois.readObject();			ArrayList<User> list=(ArrayList<User>) obj;			for(User u:list) {				System.out.println(u.getName()+":"+u.getAge());				//输出内容				//www:20				//yyy:30			}		} catch (FileNotFoundException e) {			System.out.println("【异常】未找到文件");			e.printStackTrace();		} catch (IOException e) {			System.out.println("【异常】IO出错");			e.printStackTrace();		} catch (ClassNotFoundException e) {			System.out.println("【异常】未找到类异常");			e.printStackTrace();		} finally {			if(ois!=null) {				try {					ois.close();				} catch (IOException e) {					e.printStackTrace();				}			}		}		System.out.println("end");	}	}





0人推荐
随时随地看视频
慕课网APP