Java对象的序列化与反序列化

什么是序列化与反序列化?
  • java虚拟机new出的对象存储在内存中,序列化就是将对象转换为字节流的过程,写入到文件中保存起来或通过网络传输。反序列化是将字节流读取后转换成序列化之前的对象。
  • 举个例子:定义了一个person类,其中类里面有姓名 String name,性别 String sex,年龄 int age等成员变量。new出一个对象后赋予对象相关属性,但是这个属性是在内存中保存的,java JVM(虚拟机)关闭后这个对象就会消失,那么如何将该对象保存呢?即使用序列化将对象转换成字节流再写入到文件中,再次启动JVM后,可以通过反序列化将字节流转换为对象,该对象具有序列化之前的所有非静态变量的属性,即person中的name,sex,age属性不变。

如何进行序列化、反序列化?

  • java实现序列化的过程比较简单,通常不需要编写保存或恢复对象的过程代码,实现java.io.Serializable接口的类的对象就可以转换字节流或者从字节流中恢复,不需要在类里面实现任何代码。
  • Serializable接口没有定义任何成员,只是表示一个类可以被序列化。
  • 当一个对象被序列化时,只保存对象的非静态成员变量,不保存任何方法和静态成员变量。
  • 如果一个对象的成员变量是另一个类的对象,那么这个对象的数据也会被保存。
  • 声明成transient的变量不会被序列化存储。
  • 如果对象中包含的对象的引用是不可序列化的,那么序列化会失败,抛出NotSerializable异常。

序列化、反序列化相关接口和类

  • ObjectOutput接口
    • ObjectOutput接口继承DataOutput接口并支持对象序列化,其中writeObject()方法的作用为序列化一个对象,可以讲对象放入文件里。
    • 出错引发IOException
  • ObjectOutputStream类 
    • ObjectOutputStream类继承OutputStream 类和实现ObjectOutput 接口。它负责向流写入对象。该类的构造方法如下: 
      –ObjectOutputStream(OutputStream outStream) throws IOException 
    • 参数outStream 是序列化的对象将要写入的输出流。
  • ObjectInput接口
    • ObjectInput 接口继承DataInput接口。它支持对象序列化。特别注意 readObject( )方法,它叫反序列化对象,是从文件里面读取出对象。所有这些方法在出错情况下引发IOException 异常。
  • ObjectInputStream类
    •  ObjectInputStream 继承InputStream 类并实现ObjectInput 接口。ObjectInputStream 负责从流中读取对象。该类的构造方法如下: 
      – ObjectInputStream(InputStream inStream) throws IOException,StreamCorruptedException
    • 参数inStream 是序列化对象将被读取的输入流。
import java.io.Serializable;

public class person implements Serializable {
	public String name;
	public String sex;
	public int age;

	public void sayhello() {
		System.out.println(this.name + " say hello");
	}

	public void sayall() {
		System.out.println(this.name + " " + this.sex + " " + this.age);
	}

	public person(String name, String sex, int age) {
		this.name = name;
		this.sex = sex;
		this.age = age;
	}
}

import java.io.*;

public class SerializeDemo {
	public static void main(String[] args) {
		person np1 = new person("prime7", "nan", 22);
		try {
			FileOutputStream fos = new FileOutputStream("person.txt");
			ObjectOutputStream oos = new ObjectOutputStream(fos);
			oos.writeObject(np1);
			oos.flush();
			oos.close();
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		np1.sayhello();
		person np2 = null;
		try {
			FileInputStream fis = new FileInputStream("person.txt");
			ObjectInputStream ois = new ObjectInputStream(fis);
			np2 = (person) ois.readObject();
			np2.sayall();
			ois.close();
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值