继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

序列化和反序列化

安卓软件程序开发入门学习
关注TA
已关注
手记 289
粉丝 49
获赞 282

(一)序列化  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");	}	}





打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP