JavaSE I/O 序列化Serializable

本文深入探讨了Java序列化的基本概念、注意事项及实现过程,通过示例代码展示了如何序列化与反序列化对象,强调了序列化时需避免序列化方法函数、静态变量和transient关键字标记的变量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一Definition

序列化:

即是 将 对象的变量信息 转换为字节流 保存起来,并在以后能还原这个对象的信息(反序列化)。 。通俗来讲,就是将对象的信息从内存保存到磁盘上。


二Notice

注意:

a)对象的 方法函数不能序列化

b)对象的static静态变量不能序列化(因为静态变量是类的,不是对象的)

c)标示为transient关键字的变量不能序列化。

只有实现了Serializable接口的类的对象才能被序列化!Only objects that support the java.io.Serializable interface can be written to streams.


三KeyPoint

序列化使用到类 ObjectOutputStream (An ObjectOutputStream writes primitive data types and graphs of Java objects to an OutputStream)

序列化的实现:将需要被序列化的类实现Serializable接口,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。


四ExampleCase


package com.javaIO.Serialization;

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

public class SerializeTest {

	public static void main(String[] args) throws Exception {
        //将Person类的3个对象序列化
		Person p1 = new Person(45, "zhang", 1.87);
		Person p2 = new Person(87, "lisi", 1.34);
		Person p3 = new Person(49, "wangwu", 1.78);

		//写到文件流中
		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(
				"Seria.txt"));
		oos.writeObject(p1);// 写对象
		oos.writeObject(p2);
		oos.writeObject(p3);
		oos.close();
		
		//------------------------Anti-Serialization----------------------------
		ObjectInputStream ois = new ObjectInputStream(new FileInputStream(
		"Seria.txt"));
		Person p4=(Person)ois.readObject();
		Person p5=(Person)ois.readObject();
		Person p6=(Person)ois.readObject();
		
		System.out.println(p4.getLength()+" "+p4.getName()+" "+p4.getNumber());
		System.out.println(p5.getLength()+" "+p5.getName()+" "+p5.getNumber());
		System.out.println(p6.getLength()+" "+p6.getName()+" "+p6.getNumber());
		ois.close();

	}

}

class Person implements Serializable {

	int number;
	String name;
	transient double length;  //把length变量标示为transient,则该变量不会被序列化。

	//函数方法不会被序列化。序列化是指保存对象的状态,以便以后的恢复
	public int getNumber() {
		return number;
	}


	public String getName() {
		return name;
	}


	public double getLength() {
		return length;
	}


	public Person(int num, String na, double len) {
		this.number = num;
		this.name = na;
		this.length = len;

	}
}

输出:

0.0 zhang 45
0.0 lisi 87
0.0 wangwu 49


显然 length变量没有被序列化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值