java编程基础-序列化与反序列化

Posted Ocean:)

tags:

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

序列化

ObjectOutputStream类

将对象数据序列化,保存到文件中

  • 构造方法Constructor

    ObjectOutPutStream(OutputStream out);

    输出字节流对象作为当前方法的参数

新建Person类作为实例:

package cn.ocean888;

import java.io.Serializable;

// 如果一个类需要序列化,则需要遵从Serializable接口
public class Person implements Serializable{
	private String name;
	private int age;
	private char gender;
	
	
	public Person() {
		super();
	}


	public Person(String name, int age, char gender) {
		super();
		this.name = name;
		this.age = age;
		this.gender = gender;
	}


	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;
	}


	public char getGender() {
		return gender;
	}


	public void setGender(char gender) {
		this.gender = gender;
	}


	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + ", gender=" + gender + "]";
	}
}
Person类序列化
package cn.ocean888;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class Demo1 {
	public static void main(String[] args) {
		ObjectOutputStream objectOutputStream = null;
		
		try {
			objectOutputStream = new ObjectOutputStream(new FileOutputStream("D:\\\\JavaCode\\\\test\\\\person.txt"));
			// 序列化对象写入文件中
			objectOutputStream.writeObject(new Person("ocean", 10, '男'));
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (objectOutputStream != null) {
				try {
					objectOutputStream.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
}

ObjectInputStream类

从文件中读取被序列化之后的字节数据,提供反序列化操作,得到一个对象

  • 构造方法Constructor

    ObjectInputStream(InputStream in);

    需要提供一个字节输入流对象来进行操作

Person类反序列化
package cn.ocean888;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class Demo1 {
	public static void main(String[] args) {
		writeObject();
		readObject();
	}

	private static void writeObject() {
		ObjectOutputStream objectOutputStream = null;
		
		try {
			objectOutputStream = new ObjectOutputStream(new FileOutputStream("D:\\\\JavaCode\\\\test\\\\person.txt"));
			// 序列化对象写入文件中
			objectOutputStream.writeObject(new Person("ocean", 10, '男'));
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (objectOutputStream != null) {
				try {
					objectOutputStream.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
	
	private static void readObject() {
		ObjectInputStream objectInputStream = null;
		
		try {
			objectInputStream = new ObjectInputStream(new FileInputStream("D:\\\\JavaCode\\\\test\\\\person.txt"));
			// 从保存字节序列化数据的文件中读取一个对象返回,返回值类型是Object类型
			// 实际保存的是Person类型,可以进行强制转换
			Person p = (Person) objectInputStream.readObject();
			System.out.println(p);
			
		} catch (IOException | ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			if (objectInputStream != null) {
				try {
					objectInputStream.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
}

成功读取序列化对象

反序列化注意事项

  1. 如果一个类需要进行序列化操作,必须遵从java.io.Serializable,不遵从无法进行序列化操作

  2. 序列化之后从文件中读取序列化内容,转换成对应的对象

    ClassNotFound

  3. transient修饰的成员变量不能被序列化

以上是关于java编程基础-序列化与反序列化的主要内容,如果未能解决你的问题,请参考以下文章

Java基础-IO流对象之序列化与反序列化

Java基础序列化与反序列化深入分析

Java基础IO流序列化与反序列化

Java基础系列8:Java的序列化与反序列化

JAVA基础之序列化与反序列化

Java序列化与反序列化学习:序列化接口说明