1.什么是序列化和反序列化?
序列化是将java对象序列化为一个二进制数据
反序列化是将对象的二进制数据转换为对象拿出来使用
2.序列化有什么用?
- 可以将数据保存在本地磁盘中
- 可以在网络中进行传输
3.序列化实现
使用的是ObjectInputStream和ObjectOutputStream
3.1.保存本地磁盘
实体类Person
public class Person implements Serializable {
private static final long serialVersionUID = -5820306334982742687L;
private String name;
private int age;
private int change;
private Account account;
public Person(String name, int age, int change, Account account) {
this.name = name;
this.age = age;
this.change = change;
this.account = account;
}
public int getChange() {
return change;
}
public void setChange(int change) {
this.change = change;
}
public Account getAccount() {
return account;
}
public void setAccount(Account account) {
this.account = account;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", change=" + change +
", account=" + account +
'}';
}
}
实体类Account
public class Account implements Serializable {
double balance;
public Account(double balance) {
this.balance = balance;
}
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
@Override
public String toString() {
return "Account{" +
"balance=" + balance +
'}';
}
}
使用ObjectInputStream和ObjectOutputStream实现对象序列化和反序列化
package com.objectstream.java;
import com.objectstream.bean.Account;
import com.objectstream.bean.Person;
import org.junit.Test;
import java.io.*;
/**
* 对象流的使用
* 1.ObjectInputStream和 ObjectOutputStream
* 2.作用
* 3.对象可序列化的要求:对象及其属性是可序列化的,要加UID
* 4.ObjectInputStream和 ObjectOutputStream不能序列化 static 和 transient 修饰的变量
* @author 27938
*/
public class ObjectInputOutputStreamTest {
/**
序列化:内存中java对象保存在磁盘中或通过网络传输出去
*/
@Test
public void testObjectOutputStream() {
ObjectOutputStream oos = null;
try {
oos = new ObjectOutputStream(new FileOutputStream(new File("object.dat")));
// oos.writeObject(new String("为了田田和自己"));
oos.writeObject(new Person("田田",20,0,new Account(1000)));
oos.flush();//刷新操作
} catch (IOException e) {
e.printStackTrace();
} finally {
if (oos != null) {
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 反序列化
*/
@Test
public void testObjectInputStream() {
ObjectInputStream ois = null;
try {
ois = new ObjectInputStream(new FileInputStream(new File("object.dat")));
System.out.println(ois.readObject().toString());
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
if (ois != null) {
try {
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
序列化注意事项
1.首先序列化的对象必须是可序列化的。
对象可序列化的前提:实现Serializable接口、标识码UID、属性也是可序列化的。
2.static 和 transient 修饰的变量是不可被序列化的,否侧被修饰的变量序列化操作后会出现null值