Java?序列化和反序列化

什么是序列化/反序列化?

序列化:將對(duì)象轉(zhuǎn)換為字節(jié)序列的過(guò)程稱為對(duì)象的序列化
反序列化:將字節(jié)序列恢復(fù)為對(duì)象的過(guò)程稱為對(duì)象的反序列化

序列化能干什么?

  1. 存儲(chǔ),比如把對(duì)象序列化為字節(jié)序列永久保存到磁盤上
  2. 傳輸,網(wǎng)絡(luò)上傳輸對(duì)象的字節(jié)序列

序列化/反序列化API

java.io.ObjectOutputStream代表對(duì)象輸出流,它的writeObject(Object obj)方法可將obj對(duì)象進(jìn)行序列化,把得到的字節(jié)序列寫到一個(gè)目標(biāo)輸出流中;
java.io.ObjectInputStream代表對(duì)象輸入流,它的readObject(Object obj)方法可從源輸入流中讀取字節(jié)序列,再把字節(jié)序列反序列化為對(duì)象,并返回;
序列化步驟
1)、創(chuàng)建一個(gè)對(duì)象輸出流,它可以包裝一個(gè)其他類型的目標(biāo)輸出流,如文件輸出流、字節(jié)數(shù)組輸出流等
2)、通過(guò)對(duì)象輸出流的writeObject(Object obj)方法把對(duì)象寫到一個(gè)目標(biāo)輸出流中

反序列化步驟
1)、創(chuàng)建一個(gè)對(duì)象輸入流,它可以包裝一個(gè)其他類型的源輸入流,如文件輸入流、字節(jié)數(shù)組輸入流等
2)、通過(guò)對(duì)象輸入流的readObject(Object obj)方法讀取對(duì)象

舉個(gè)例子說(shuō)明一下序列化/反序列化的應(yīng)用場(chǎng)景

package cn.ihep.clone;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class User implements Serializable {
    private static final long serialVersionUID = 1L;

    private String name;
    private int age;

    public User(String name, int age) {
        super();
        this.name = name;
        this.age = 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 + "]";
    }

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        User u1 = new User("xiaoming", 18);
        // User u2 = new User("ahua", 45);
        // User u3 = new User("zhangsan", 19);
        // User u4 = new User("lisi", 20);
        // List<User> list = new ArrayList<>();
        // list.add(u1);
        // list.add(u2);
        // list.add(u3);
        // list.add(u4);

        // 序列化
        ByteArrayOutputStream bo = new ByteArrayOutputStream();
        ObjectOutputStream oo = new ObjectOutputStream(bo);
        oo.writeObject(u1);

        // 反序列化
        ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
        ObjectInputStream oi = new ObjectInputStream(bi);
        User u = (User) oi.readObject();
        System.out.println(u);
    }
}
------------------------
輸出結(jié)果:
User [name=xiaoming, age=18]
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.背景 某天,我在寫代碼定義 bean 的時(shí)候,順手寫了個(gè) public class User implemen...
    李眼鏡閱讀 855評(píng)論 0 2
  • 1. Java序列化和反序列化(What) Java序列化(Serialize)是指將一個(gè)Java對(duì)象寫入IO流中...
    悠揚(yáng)前奏閱讀 975評(píng)論 2 1
  • JAVA序列化機(jī)制的深入研究 對(duì)象序列化的最主要的用處就是在傳遞,和保存對(duì)象(object)的時(shí)候,保證對(duì)象的完整...
    時(shí)待吾閱讀 11,175評(píng)論 0 24
  • 題外話:從事IT要學(xué)習(xí)的東西太多了,有時(shí)候會(huì)比較浮躁,因?yàn)橐獙W(xué)的東西太多但又無(wú)從下手,甚至有很多基礎(chǔ)都還沒(méi)有深入學(xué)...
    Garwer閱讀 906評(píng)論 2 9
  • 什么是序列化? 序列化是將對(duì)象存儲(chǔ)為二進(jìn)制格式。在序列化的過(guò)程中,對(duì)象和它的元數(shù)據(jù)(比如對(duì)象的類名和它的屬性名稱)...
    Chokez閱讀 1,142評(píng)論 0 0

友情鏈接更多精彩內(nèi)容