序列化和反序列化

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了序列化和反序列化相关的知识,希望对你有一定的参考价值。

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





以上是关于序列化和反序列化的主要内容,如果未能解决你的问题,请参考以下文章

python代码实现二叉树的序列化和反序列化

序列化和反序列化的示例代码

Django REST framework序列化

rest_framework

csharp 此代码演示了json序列化和反序列化的4种方法

Django REST framework 基本组件