java序列化一个对象
什么叫对象序列化:??
其实就是把一个对象变为二进制的数据流的一种方法,通过对象序列化可以方便的实现对象的传输或存储,其实就是为了保存在内存中的各种对象的状态,并且可以把保存的对象状态再读出来。
写入序列化数据到文件中,主要是两个对象,一个对象是FileOutputStream 对象,一个是ObjectOutputStream 对象,ObjectOutputStream 负责向指定的流中写入序列化的对象。当从文件中读取序列化数据时,主要需要两个对象,一个是FileInputStream ,一个是ObjectInputStream 对象,ObjectInputStream 负责从指定流中读取序列化数据并还原成序列化前得对象。另外,序列化的读取数据与写入的顺序相同,比如我们序列化时先写入数据A ,再写入B ,最后写入C ;那么我们再读取数据的时候,读取到的第一个数据为A ,读取到的第二个数据为B ,最后读取到的数据为C ,即:先写入先读取的原则。
在序列化一个对象的时候,这个对象必须实现java.io.Serializable 接口, Serializable 接口中不含任何方法,这个可以理解为声明该对象是可以序列化的方法吧。当我们在序列化一个对象时,有些属性我们不想序列化(可以减少数据量),那么我们可以声明该属性为瞬间态(用transient 关键字声明)。另外,静态字段也是不会被序列化的.
什么情况下需要序列化 ??
1、把的内存中的对象保存到一个文件中或者数据库中时候
2、远程进行对象的传输
为什么要对对象进行序列化?
采用数据流来存储 ,以数据流传输会提高网络传输速度.
为什么要对对象进行序列化?
采用数据流来存储 ,以数据流传输会提高网络传输速度.
这里利用TestRead,TestWrite 类来测试序列化对象StudentSerializable ,StudentSerializable name 属性是瞬时态的,sex 属性是static ,pwd 是非瞬时态也非static 。
[1] 序列化对象SerializeStudent代码
package com.bwie.serializable;
import java.io.Serializable;
public class StudentSerializable implements Serializable {
/**
* 类描述:用户信息
* 作者:李晓阳
* 日期:2016年6月23日 下午7:32:26
*
*/
/**
* 序列化对象的标识,用于在反序列化的时候使用 <BR>
* 反序列化的时候,如果当前内存中已经有这个标识的对象,则认为是同一类对象
*/
private static final long serialVersionUID = 1L;
/** 演示瞬时态对象不会被序列化 */
private transient String name;
/**成员属性 */
private String pwd;
/**静态属性*/
private static String sex;
public void setName(String name) {
this.name = name;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public void setSex1(String sex1) {
sex = sex1;
}
@Override
public String toString() {
return "StudentSerializable [临时:name=" + name + ", 私有:pwd=" + pwd +", 静态:sex="+sex+ "]";
}
}
<strong><span style="font-family:SimSun;font-size:18px;color:#333333;"><strong>[2] 测试类</strong></span></strong>TestWrite<strong><strong><span style="font-family:SimSun;font-size:18px;color:#333333;"></span></strong>代码(序列化写入)</strong>
package com.bwie.serializable;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
public class TestWrite {
public static void main(String[] args) throws Exception {
// 1. 序列化文件保存的地址
String filePath = "d://lyw.txt";
// 2. 构造 SerializeStudent 对象
StudentSerializable student = new StudentSerializable();
// 由于 class 是 transient ,所以不会被序列化
student.setName("lyw");
// 非瞬时态又是非静态字段,所以肯定会序列化
student.setPwd("123");
// dept 是 static ,这里不会被序列化,如果被序列化的话,那么值应该为 computer
student.setSex1("女");
// 2. 构造序列化流
FileOutputStream fos = null;
ObjectOutputStream oos = null;
try {
fos = new FileOutputStream(filePath);
oos = new ObjectOutputStream(fos);
oos.writeObject(student);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(fos != null){
fos.close();
}
if(oos != null){
oos.close();
}
}
}
}
<strong><span style="font-family:SimSun;font-size:18px;color:#333333;"><strong>[2] 测试类</strong></span></strong>Test<strong><span style="font-family:SimSun;">Read</span>代码(反序列化<span style="font-family:SimSun;">读出</span>)</strong>
package com.bwie.serializable;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
public class TestRead {
public static void main(String[] args) throws IOException {
// 1. 序列化文件的地址
String filePath = "d://lyw.txt";
// 2. 从序列化文件中读取出文件
FileInputStream iStrem = null;
ObjectInputStream oStream = null;
try {
iStrem = new FileInputStream(filePath);
oStream = new ObjectInputStream(iStrem);
// 读取信息
StudentSerializable studentSerializable = (StudentSerializable)oStream.readObject();
System.out.println(studentSerializable);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(oStream !=null){
oStream.close();
}
if(iStrem != null){
iStrem.close();
}
}
}
}