java中的序列化

本文详细介绍了Java中对象序列化的概念、实现方法及示例。序列化是指将对象的状态信息转换为可以存储或传输的形式的过程。在Java中,实现序列化需要让类实现Serializable接口并生成serialVersionUID。

一、概念

对象是由一个程序创建的,当程序被关掉,对象自然就消失了。为了能够使得对象能够保存还原,甚至通过网络等传输,就有了对象序列化这个概念。我是觉得和持久化一个概念。java对象序列化最强大的一个方面是针对对象所有连环的引用都能够进行保存,并且能够反序列化。

二、实现

1.在java中对象序列化必须要继承Serializable接口,这个接口只是一个标识,标示能够进行序列化。该对象所引用的其他对象,以及其他对象所引用的其他其他对象也必须继承Serializble接口,不然序列化时会抛出异常java.io.NotSerializableException。还要生成serialVersionUID,这个ID是根据属性和方法生成的。表示版本号。如果反序列化的时候,版本号不一致就会抛出异常。

2.序列化的实现非常简单:首先要有一个ObjectOutputStream 对象 ,然后调用writeObject(Object objec)方法就行了。反序列化需要有一个ObjectInputStream对象,然后调用readObject()方法。再强行转换成你要的类就行了。


三、demo

public class Wheel implements Serializable{
	private static final long serialVersionUID = 5801095499370035805L;
	private String id;
	private String brand;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getBrand() {
		return brand;
	}
	public void setBrand(String brand) {
		this.brand = brand;
	}
}

public class Car implements Serializable{
	private static final long serialVersionUID = 5765553644244739065L;
	private Wheel[] wheel ;
	
	private String brand;
	
	private int price ;
	private String ow;
	public Wheel[] getWheel(  ) {
		return wheel;
	}
	public void setWheel(Wheel[] wheel) {
		this.wheel = wheel;
	}
	public String getBrand() {
		return brand;
	}
	public void setBrand(String brand) {
		this.brand = brand;
	}
	public int getPrice() {
		return price;
	}
	
	public void setPrice(int price) {
		this.price = price;
	}
}

public static void main(String[] args) throws IOException, ClassNotFoundException{
		FileOutputStream fos = new FileOutputStream(new File("/home/liubin/test.txt"));
		ObjectOutputStream oos = new ObjectOutputStream(fos);
		Wheel[] wheel = new Wheel[4];
		wheel[0] = new Wheel();
		wheel[0].setBrand("JIATONG");
		wheel[0].setId("00001");
		wheel[1] = new Wheel();
		wheel[1].setBrand("JIATONG");
		wheel[1].setId("00002");
		wheel[2] = new Wheel();
		wheel[2].setBrand("JIATONG");
		wheel[2].setId("00003");
		wheel[3] = new Wheel();
		wheel[3].setBrand("JIATONG");
		wheel[3].setId("00004");
		
		Car car = new Car();
		car.setPrice(800000);
		car.setBrand("BMW");
		car.setWheel(wheel);
		oos.writeObject(car);
		oos.flush();
		oos.close();
		
		//反序列化
		FileInputStream fis = new FileInputStream(new File("/home/liubin/test.txt"));
		ObjectInputStream ois = new ObjectInputStream(fis);
		Object object = ois.readObject();
		ois.close();
		Car cars = (Car)object;
		System.out.println(car);
		System.out.println(cars);
		System.out.println(car == cars);
	}
}

最终Car对象写入到文件中,然后能够反序列化。

关于Externalizable这个类是继承了Serializable,但是可以实现对序列化的一些控制,就不多说了。还有一点就是transient这个关键字修饰的属性或者是方式是不参与序列化的。此外使用static修饰的属性也是不参与序列化的。

转载于:https://my.oschina.net/u/2250599/blog/331993

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值