JAVA_基礎IO流對象流(三)
處理流:對象流
ObjectInputStream
和OjbectOutputSteam
用於存儲和讀取基本數據類型數據或對象的處理流。可以把Java中的對象寫入到數據源中,也能把對象從數據源中還原回來。
序列化:用ObjectOutputStream
類保存基本類型數據或對象的機制。
反序列化:用ObjectInputStream
類讀取基本類型數據或對象的機制
對象序列化機制
序列化:將記憶體中的Java對象轉換成二進位流持久地保存在磁碟上,或通過網路將這種二進位流傳輸到另一個網路節點(ObjectOutputStream
)。
反序列化:將磁碟文件中的二進位流還原成記憶體中的一個Java對象(ObjectInputStream
)。
要想將一個自定義的Java對象是可序列化的,需要滿足相應的要求:
- 需要實現介面:
Serializable
。 - 給當前類提供全局常量:
serialVersionUID
。 - 除了當前類(Person)需要實現Serializable介面,還需要保證內部所有的屬性也是可序列化的。(默認情況下,基本數據類型都是可序列化的)
注意:
ObjectOutputStream
和ObjectInputStream
不能序列化static
和transient
修飾的成員變數。
transient
修飾符: 不可序列化的。
序列化對象:
public class Person implements Serializable {
public static final long serialVersionUID = 48542L;
private String name;
private int age;
private Account account;
....// get、set方法
}
class Account implements Serializable {
private static final long serialVersionUID = 68547L;
double money;
....// get、set方法
}
序列化操作:
/** 序列化 */
@Test
public void testObjectOutputStream() {
ObjectOutputStream objectOutputStream = null;
try {
objectOutputStream = new ObjectOutputStream(new FileOutputStream(new File("object.dat")));
objectOutputStream.writeObject(new String("世界您好!"));
objectOutputStream.flush();
objectOutputStream.writeObject(new Person("Tom",20));
objectOutputStream.flush();
objectOutputStream.writeObject(new Person("Jerry",20,new Account(20000)));
objectOutputStream.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (objectOutputStream != null) objectOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/** 反序列化 */
@Test
public void testObjectInputStream() {
ObjectInputStream objectInputStream = null;
try {
objectInputStream = new ObjectInputStream(new FileInputStream(new File("object.dat")));
Object object = objectInputStream.readObject();
String str = (String) object;
Person person1 = (Person) objectInputStream.readObject();
Person person2 = (Person) objectInputStream.readObject();
System.out.println(str);// 世界您好!
System.out.println(person1);// Person{name='Tom',age=20,account=null}
System.out.println(person2);// Person{name='Jerry',age=20, account=Account{money=20000.0}}
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
try {
if (objectInputStream != null) objectInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}