49-对象序列化

对象序列化

  几乎只要是Java开发就一定存在序列化的概念,由于序列化的概念逐步发展,慢慢也有了更多地序列化的标准。

对象序列化基本概念

  所谓的对象序列化指的是将内存中保存的对象以二进制数据流的形式进行处理,可以实现对象的保存或者是网络传输。
y5cIT1.png
  然而并不是所有的对象都可以被序列化,在Java中有一个强制性的要求:如果要序列化的对象,那么对象所在的类一定要实现java.io.Serializable父接口,作为序列化的标记。这个接口没有任何的方法,因为他描述的是一种类的能力。
定义一个可以被序列化的类

import java.io.Serializable;

@SuppressWarnings("serial")		//压制警告
class Person implements Serializable{	//Person可以被序列化	
	private String name;
	private int age;
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
}

  此时Person类产生的每一个对象都可使实现二进制的数据传输,属于可以被序列化的程序类。

序列化与反序列化处理

  有了序列化的支持类之后如果想实现序列化与反序列化的操作,可以利用以下两个类来完成:

类名称序列化:ObjectOutputStream反序列化:ObjectInputStream
类定义public class ObjectOutputStream extends OutputStream implements ObjectOutput,ObjectStreamConstantspublic class ObjectInputStream extends implements ObjectInput,ObjectStreamConstants
构造方法public ObjectOutputStream(OutputStream out) throws IOExceptionpublic ObjectInputStream(InputStream in) throws IOException
方法public final void writeObject(Object obj) throws IOExceptionpublic final Object readObject() throws IOException,ClassNotFoundException

实现序列化与反序列化

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

@SuppressWarnings("serial")		//压制警告
class Person implements Serializable{	//Person可以被序列化	
	private String name;
	private int age;
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
	
}

public class Basic_study {
	public static final File SAVE_FILE = new File("C:\\Project\\Java_study\\src\\文件\\test.person");
	public static void main(String[] args) throws Exception {
		//saveObject(new Person("lyz",18));
		System.out.println(loadObject());
	}
	public static void saveObject(Object obj) throws Exception{
		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(SAVE_FILE));
		oos.writeObject(obj);		//序列化
		oos.close();
	}
	public static Object loadObject() throws Exception{
		ObjectInputStream ois = new ObjectInputStream(new FileInputStream(SAVE_FILE));
		Object obj = ois.readObject();		//反序列化
		ois.close();
		return obj;
	}
}

  java中对象序列化与反序列化必须使用内部提供的对象操作流,因为牵扯到二进制数据的格式,所以不能自定义处理,另外要想实现一组对象的实例化,可以使用对象数组完成。
  在很多实际项目开发中,开发者很少见到ObjectOutputStream、ObjectInputStream类的直接操作,因为会有一些容器帮助开发者自动实现。

transient关键字

  默认情况下执行了对象序列化的时候会将类中的全部属性的内容进行全部的序列化,但是很多情况下有一些属性并不需要进行序列化的处理,这个会后就可以在属性定义上使用transient关键字来完成。
private transient String name;
  在进行序列化处理的时候name属性的内容是不会被保存下来的,换言之读取的数据name将是其对应数据类型的默认值。
  如果假设类之中一些需要计算保存的属性内容往往无需序列化,此时使用transient。在实际开发中大部分需要被序列化的类往往都是简单java类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值