Java實(shí)現(xiàn)序列化與反序列化的簡(jiǎn)單示例
1.Java序列化與反序列化
Java序列化是指把Java對(duì)象轉(zhuǎn)換為字節(jié)序列的過(guò)程;而Java反序列化是指把字節(jié)序列恢復(fù)為Java對(duì)象的過(guò)程。
2.為什么需要序列化與反序列化
我們知道,當(dāng)兩個(gè)進(jìn)程進(jìn)行遠(yuǎn)程通信時(shí),可以相互發(fā)送各種類(lèi)型的數(shù)據(jù),包括文本、圖片、音頻、視頻等, 而這些數(shù)據(jù)都會(huì)以二進(jìn)制序列的形式在網(wǎng)絡(luò)上傳送。那么當(dāng)兩個(gè)Java進(jìn)程進(jìn)行通信時(shí),能否實(shí)現(xiàn)進(jìn)程間的對(duì)象傳送呢?答案是可以的。如何做到呢?這就需要Java序列化與反序列化了。換句話(huà)說(shuō),一方面,發(fā)送方需要把這個(gè)Java對(duì)象轉(zhuǎn)換為字節(jié)序列,然后在網(wǎng)絡(luò)
傳送;另一方面,接收方需要從字節(jié)序列中恢復(fù)出Java對(duì)象。
當(dāng)我們明晰了為什么需要Java序列化和反序列化后,我們很自然地會(huì)想Java序列化的好處。其好處一是實(shí)現(xiàn)了數(shù)據(jù)的持久化,通過(guò)序列化可以把數(shù)據(jù)永久地保存到硬盤(pán)上(通常存放在文件里),二是,利用序列化實(shí)現(xiàn)遠(yuǎn)程通信,即在網(wǎng)絡(luò)上傳送對(duì)象的字節(jié)序列。
3.示例:
(1)序列化反序列化文件:
import java.io.*;
@SuppressWarnings("serial")
class Person implements Serializable {
public Person(String name, String sex, int age, int height) {
this.name = name;
this.sex = sex;
this.age = age;
this.height = height;
}
public String toString() {
return "|" + this.name + "|" + this.sex + "|" + this.age + "|"
+ this.height + "|";
}
public String name;
public String sex;
public int age;
public int height;
}
public class SerialTest {
public static void main(String[] args) throws FileNotFoundException,
IOException, ClassNotFoundException {
Person p = new Person("Jim", "male", 28, 194);
// 開(kāi)始序列化
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(
new File("myTest.txt")));
oos.writeObject(p);
// 反序列化
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(
new File("myTest.txt")));
Person p1 = (Person) ois.readObject();
System.out.println(p1.toString());
}
}
(2)XML反序列化成class:
import java.io.*;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
@SuppressWarnings("serial")
class RoadInfo implements Serializable {
public int id;
public long MDN;
public String NAME;
public double LNG;
public double LAT;
public String ICON;
}
@SuppressWarnings("serial")
class table_list implements Serializable {
public String toString() {
StringBuffer sb = new StringBuffer();
for (RoadInfo r : sequence) {
sb.append("|");
sb.append(r.id);
sb.append("|");
sb.append(r.MDN);
sb.append("|");
sb.append(r.NAME);
sb.append("|");
sb.append(r.LNG);
sb.append("|");
sb.append(r.LAT);
sb.append("|");
sb.append(r.ICON);
sb.append("|\n");
}
return sb.toString();
}
public table_list(int count) {
sequence = new RoadInfo[count];
for (int i = 0; i < count; i++) {
sequence[i] = new RoadInfo();
}
}
public RoadInfo[] sequence;
}
public class XMLTest {
/**
* @param args
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
StringBuffer sb = new StringBuffer();
BufferedReader reader = new BufferedReader(new FileReader(new File(
"friend_msg.xml")));
while (true) {
String s = reader.readLine();// 讀一行
if (s == null) {
break;
}
sb.append(s);
}
XStream xs = new XStream(new DomDriver());
table_list db = (table_list) xs.fromXML(sb.toString());
System.out.println(db.toString());
}
}
相關(guān)文章
springboot啟動(dòng)后和停止前執(zhí)行方法示例詳解
這篇文章主要介紹了springboot啟動(dòng)后和停止前執(zhí)行方法,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08
簡(jiǎn)單的用java實(shí)現(xiàn)讀/寫(xiě)文本文件的示例
同時(shí)也展示了如果從輸入流中讀出來(lái)內(nèi)容寫(xiě)入輸出流中(僅限文本流) 三個(gè)例子可以獨(dú)立存在,所以根據(jù)需要只看其中一個(gè)就行了。2008-07-07
使用Java實(shí)現(xiàn)獲取excel附件并解析
在Java中,我們經(jīng)常需要讀取Excel文件中的數(shù)據(jù),進(jìn)行處理和分析,本文將介紹如何使用Java代碼來(lái)獲取與解析Excel文件中的附件,希望對(duì)大家有所幫助2025-04-04
SpringCloud_Sleuth分布式鏈路請(qǐng)求跟蹤的示例代碼
Spring Cloud Sleuth是一款針對(duì)Spring Cloud的分布式跟蹤工具,本文通過(guò)實(shí)例代碼介紹了SpringCloud_Sleuth分布式鏈路請(qǐng)求跟蹤,感興趣的朋友跟隨小編一起看看吧2023-02-02
Java如何向主函數(shù)main中傳入?yún)?shù)
這篇文章主要介紹了Java如何向主函數(shù)main中傳入?yún)?shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
spring源碼閱讀--aop實(shí)現(xiàn)原理講解
這篇文章主要介紹了spring源碼閱讀--aop實(shí)現(xiàn)原理講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09

