欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Java中對(duì)象序列化與反序列化

 更新時(shí)間:2016年02月27日 11:30:32   投稿:lijiao  
這篇文章主要為大家詳細(xì)介紹了Java中對(duì)象序列化與反序列化,感興趣的小伙伴們可以參考一下

        序列化 (Serialization)是將對(duì)象的狀態(tài)信息轉(zhuǎn)換為可以存儲(chǔ)或傳輸?shù)男问降倪^(guò)程。一般將一個(gè)對(duì)象存儲(chǔ)至一個(gè)儲(chǔ)存媒介,例如檔案或是記億體緩沖等。在網(wǎng)絡(luò)傳輸過(guò)程中,可以是字節(jié)或是XML等格式。而字節(jié)的或XML編碼格式可以還原完全相等的對(duì)象。這個(gè)相反的過(guò)程又稱(chēng)為反序列化
Java對(duì)象的序列化與反序列化
  在Java中,我們可以通過(guò)多種方式來(lái)創(chuàng)建對(duì)象,并且只要對(duì)象沒(méi)有被回收我們都可以復(fù)用該對(duì)象。但是,我們創(chuàng)建出來(lái)的這些Java對(duì)象都是存在于JVM的堆內(nèi)存中的。只有JVM處于運(yùn)行狀態(tài)的時(shí)候,這些對(duì)象才可能存在。一旦JVM停止運(yùn)行,這些對(duì)象的狀態(tài)也就隨之而丟失了。
  但是在真實(shí)的應(yīng)用場(chǎng)景中,我們需要將這些對(duì)象持久化下來(lái),并且能夠在需要的時(shí)候把對(duì)象重新讀取出來(lái)。Java的對(duì)象序列化可以幫助我們實(shí)現(xiàn)該功能。
  對(duì)象序列化機(jī)制(object serialization)是Java語(yǔ)言?xún)?nèi)建的一種對(duì)象持久化方式,通過(guò)對(duì)象序列化,可以把對(duì)象的狀態(tài)保存為字節(jié)數(shù)組,并且可以在有需要的時(shí)候?qū)⑦@個(gè)字節(jié)數(shù)組通過(guò)反序列化的方式再轉(zhuǎn)換成對(duì)象。對(duì)象序列化可以很容易的在JVM中的活動(dòng)對(duì)象和字節(jié)數(shù)組(流)之間進(jìn)行轉(zhuǎn)換。
  在Java中,對(duì)象的序列化與反序列化被廣泛應(yīng)用到RMI(遠(yuǎn)程方法調(diào)用)及網(wǎng)絡(luò)傳輸中。
  相關(guān)接口及類(lèi)
  Java為了方便開(kāi)發(fā)人員將Java對(duì)象進(jìn)行序列化及反序列化提供了一套方便的API來(lái)支持。其中包括以下接口和類(lèi):

  •          java.io.Serializable
  •   java.io.Externalizable
  •   ObjectOutput
  •   ObjectInput
  •   ObjectOutputStream
  •   ObjectInputStream
  •   Serializable 接口

  類(lèi)通過(guò)實(shí)現(xiàn) java.io.Serializable 接口以啟用其序列化功能。未實(shí)現(xiàn)此接口的類(lèi)將無(wú)法使其任何狀態(tài)序列化或反序列化??尚蛄谢?lèi)的所有子類(lèi)型本身都是可序列化的。序列化接口沒(méi)有方法或字段,僅用于標(biāo)識(shí)可序列化的語(yǔ)義。 (該接口并沒(méi)有方法和字段,為什么只有實(shí)現(xiàn)了該接口的類(lèi)的對(duì)象才能被序列化呢?)
  當(dāng)試圖對(duì)一個(gè)對(duì)象進(jìn)行序列化的時(shí)候,如果遇到不支持 Serializable 接口的對(duì)象。在此情況下,將拋出NotSerializableException。
  如果要序列化的類(lèi)有父類(lèi),要想同時(shí)將在父類(lèi)中定義過(guò)的變量持久化下來(lái),那么父類(lèi)也應(yīng)該集成java.io.Serializable接口。
  下面是一個(gè)實(shí)現(xiàn)了java.io.Serializable接口的類(lèi)

package com.hollischaung.serialization.SerializableDemos;
import java.io.Serializable;
/**
* Created by hollis on 16/2/17.
* 實(shí)現(xiàn)Serializable接口
*/
public class User1 implements Serializable {
private String name;
private int age;
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 "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}

通過(guò)下面的代碼進(jìn)行序列化及反序列化

package com.hollischaung.serialization.SerializableDemos;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import java.io.*;
/**
* Created by hollis on 16/2/17.
* SerializableDemo1 結(jié)合SerializableDemo2說(shuō)明 一個(gè)類(lèi)要想被序列化必須實(shí)現(xiàn)Serializable接口
*/
public class SerializableDemo1 {
public static void main(String[] args) {
//Initializes The Object
User1 user = new User1();
user.setName("hollis");
user.setAge(23);
System.out.println(user);
//Write Obj to File
ObjectOutputStream oos = null;
try {
oos = new ObjectOutputStream(new FileOutputStream("tempFile"));
oos.writeObject(user);
} catch (IOException e) {
e.printStackTrace();
} finally {
IOUtils.closeQuietly(oos);
}
//Read Obj from File
File file = new File("tempFile");
ObjectInputStream ois = null;
try {
ois = new ObjectInputStream(new FileInputStream(file));
User1 newUser = (User1) ois.readObject();
System.out.println(newUser);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
IOUtils.closeQuietly(ois);
try {
FileUtils.forceDelete(file);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//OutPut:
//User{name='hollis', age=23}
//User{name='hollis', age=23}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家學(xué)習(xí)Java中對(duì)象序列化與反序列化有所幫助。

相關(guān)文章

最新評(píng)論