- 对象序列化:把对象转换为 字节序列
- 对象反序列化:把字节序列转换为 对象
- 序列化目的:便于存储,便于传输,
- 对象序列化 前提条件:对象所属的类实现 Serializable接口, 实现 Serializable接口,仅仅是可序列化标志
- transient关键字 作用:transient关键字修饰的属性,在序列化时其值将被忽略, 具体示例如测试方法
- transient关键字 使用场景:对象序列化后得到的字节序列往往比较大,有时我们在对对象序列化时可以忽略一些不必要的属性,这时就可以用transient关键字
- serialVersionUID: 表明类的版本,在运行时判断类的 serialVersionUID来验证版本一致性,
在进行反序列化时,JVM会从字节序列中获取 serialVersonUID,然后与本地类中的serialVersionUID比较,如果一致,则反序列化;否则抛出序列化版本不一致异常。
最好显示的申明 serialVersionUID,java是跨平台的,不同平台生成的默认serialVersionUID 可能不一致 - OOS 实现对象序列化
OIS 实现对象反序列化
具体示例代码如下:
package se;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import org.junit.Test;
public class TestSerializable {
/**
* 1. 对象序列化:把对象转换为 字节序列
* 2. 对象反序列化:把字节序列转换为 对象
* 3. 序列化目的:便于存储,便于传输,
* 4. 对象序列化 前提条件:对象所属的类实现 Serializable接口, 实现 Serializable接口,仅仅是可序列化标志
* 5. transient关键字 作用:transient关键字修饰的属性,在序列化时其值将被忽略, 具体示例如测试方法
* 6. transient关键字 使用场景:对象序列化后得到的字节序列往往比较大,有时我们在对对象序列化时可以忽略一些不必要的属性,这时就可以用transient关键字
* 7. serialVersionUID: 表明类的版本,在运行时判断类的 serialVersionUID来验证版本一致性,
* 在进行反序列化时,JVM会从字节序列中获取 serialVersonUID,然后与本地类中的serialVersionUID比较,
* 如果一致,则反序列化;否则抛出序列化版本不一致异常。
* 最好显示的申明 serialVersionUID,java是跨平台的,不同平台生成的默认serialVersionUID 可能不同
* 8. OOS 实现对象序列化
* 9. OIS 实现对象反序列化
*/
@Test
public void testSerializable() throws IOException, ClassNotFoundException{
Person person = new Person("tom", 20, "male");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 序列化
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(person);
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
// 反序列化
ObjectInputStream ois = new ObjectInputStream(bais);
Person desPerson = (Person)ois.readObject();
System.out.println("desPerson: " + desPerson);
// desPerson: Person [name=null, age=20, gender=male]
}
}
Person 类如下:
package se;
import java.io.Serializable;
/**
* person类 实现 序列化接口
*/
public class Person implements Serializable{
private static final long serialVersionUID = -6114732713202180428L;
// add transient key
private transient String name;
private int age;
private String gender;
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", gender=" + gender + "]";
}
/**
* @param name
* @param age
* @param gender
*/
public Person(String name, int age, String gender) {
super();
this.name = name;
this.age = age;
this.gender = gender;
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the age
*/
public int getAge() {
return age;
}
/**
* @param age the age to set
*/
public void setAge(int age) {
this.age = age;
}
/**
* @return the gender
*/
public String getGender() {
return gender;
}
/**
* @param gender the gender to set
*/
public void setGender(String gender) {
this.gender = gender;
}
}