中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java序列化和反序列化示例分析

發布時間:2022-01-06 12:46:16 來源:億速云 閱讀:146 作者:柒染 欄目:開發技術

這期內容當中小編將會給大家帶來有關Java序列化和反序列化示例分析,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

序列化是為了把Java對象轉化為字節序列(字節流)的過程。然后深拷貝是通過對流的操作來實現的,序列化后數據方便存儲傳輸。反序列化則是把字節序列反序列化為Java對象

存儲方便:因為對象會被回收,序列化后可以持續化存儲在磁盤中
傳輸方便:字節序列(二進制形式)可以進行網絡傳輸和傳播。

最好設置一個SerialversionUID,因為序列化和反序列化是對比SerialversionUID來進行的,雖然不設置接口也會默認生成一個,但是要知道序列化對象過程一般都是對象->序列化->存儲或傳輸->反序列化。
舉個例子:
先創建一個實體類Student

import lombok.Data;

import java.io.Serializable;

@Data
public class Student implements Serializable {
    private Integer id;
    private String name;
    private String sex;
}
然后創建一個測試類SerializableTest
import serialization.entity.Student;

import java.io.*;

public class SerializableTest {
    public static void main(String[] args) throws Exception {
        serializeStudent();
        Student student = deserializeStudent();
        System.out.println("name:" + student.getName());
        System.out.println("sex:" + student.getSex());
    }

    private static void serializeStudent() throws IOException {
        Student student = new Student();
        student.setId(1);
        student.setName("張三");
        student.setSex("male");

        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(
                new File("F:/student.txt")));
        out.writeObject(student);
        System.out.println("序列化成功");
        out.close();
    }

    private static Student deserializeStudent() throws Exception {
        ObjectInputStream in = new ObjectInputStream(new FileInputStream(new File("F:/student.txt")));
        Student student = (Student) in.readObject();
        System.out.println("反序列化成功");
        return student;
    }
}
執行結果:
序列化成功
反序列化成功
name:張三
sex:male
這個時候沒有指定SerialversionUID也是可以成功的,但對象->序列化->存儲或傳輸->反序列化,咱們在反序列化操作之前對Student類修改呢?

這個時候咱們修改一下代碼,先注釋掉反序列化代碼,先進行序列化。

import serialization.entity.Student;

import java.io.*;

public class SerializableTest {
    public static void main(String[] args) throws Exception {
        serializeStudent();
//        Student student = deserializeStudent();
//        System.out.println("name:" + student.getName());
//        System.out.println("sex:" + student.getSex());
    }

    private static void serializeStudent() throws IOException {
        Student student = new Student();
        student.setId(1);
        student.setName("張三");
        student.setSex("male");

        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(
                new File("F:/student.txt")));
        out.writeObject(student);
        System.out.println("序列化成功");
        out.close();
    }

//    private static Student deserializeStudent() throws Exception {
//        ObjectInputStream in = new ObjectInputStream(new FileInputStream(new File("F:/student.txt")));
//        Student student = (Student) in.readObject();
//        System.out.println("反序列化成功");
//        return student;
//    }
}
運行結果:
序列化成功

修改Student類

import lombok.Data;

import java.io.Serializable;

@Data
public class Student implements Serializable {
    private Integer id;
    private String name;
    private String sex;
    private String address;
}
注釋掉序列化方法,進行反序列化
import serialization.entity.Student;

import java.io.*;

public class SerializableTest {
    public static void main(String[] args) throws Exception {
//        serializeStudent();
        Student student = deserializeStudent();
        System.out.println("name:" + student.getName());
        System.out.println("sex:" + student.getSex());
    }

//    private static void serializeStudent() throws IOException {
//        Student student = new Student();
//        student.setId(1);
//        student.setName("張三");
//        student.setSex("male");
//
//        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(
//                new File("F:/student.txt")));
//        out.writeObject(student);
//        System.out.println("序列化成功");
//        out.close();
//    }

    private static Student deserializeStudent() throws Exception {
        ObjectInputStream in = new ObjectInputStream(new FileInputStream(new File("F:/student.txt")));
        Student student = (Student) in.readObject();
        System.out.println("反序列化成功");
        return student;
    }
}
執行結果:
Exception in thread "main" java.io.InvalidClassException: serialization.entity.Student; local class incompatible: stream classdesc serialVersionUID = 3846952599709361171, local class serialVersionUID = -4606152942663467236
	at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:699)
	at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1885)
	at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1751)
	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2042)
	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1573)
	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:431)
	at serialization.demo.SerializableTest.deserializeStudent(SerializableTest.java:30)
	at serialization.demo.SerializableTest.main(SerializableTest.java:10)

Process finished with exit code 1
可以看出兩次的執行的SerialversionUID不匹配,導致產生java.io.InvalidClassException異常,所以只要指定了SerialversionUID就不會報異常。
//指定serialVersionUID正確寫法
private static final long serialVersionUID = 3846952599709361171L;

//如果已經進行序列化了不知道SerialversionUID,可以通過反射獲取
Object obj = Student.class.newInstance();
Field field = Student.class.getDeclaredField("serialVersionUID");
field.setAccessible(true);
System.out.println(field.getLong(obj));

最后需要知道的一點就是字節流字符流的區別。
字節流:傳輸過程中,傳輸數據的最基本單位是字節的流。
字符流:傳輸過程中,傳輸數據的最基本單位是字符的流。

這樣講可能有點不知所云,字節其實就是Java的八大基本類型Byte(比特)單位,而字符通常是’A’、‘B’、’$’、’&'等,字節大小則取決于你是什么編碼(環境),如下:

ASCII 碼中,一個英文字母(不分大小寫)為一個字節,一個中文漢字為兩個字節。

UTF-8 編碼中,一個英文字為一個字節,一個中文為三個字節。

Unicode 編碼中,一個英文為一個字節,一個中文為兩個字節。

符號:英文標點為一個字節,中文標點為兩個字節。例如:英文句號 . 占1個字節的大小,中文句號 。

占2個字節的大小。UTF-16 編碼中,一個英文字母字符或一個漢字字符存儲都需要 2 個字節(Unicode 擴展區的一些漢字存儲需要 4 個字節)。

UTF-32 編碼中,世界上任何字符的存儲都需要 4 個字節。

上述就是小編為大家分享的Java序列化和反序列化示例分析了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

自治县| 绿春县| 叙永县| 双桥区| 宜兰县| 安吉县| 宁都县| 阳西县| 罗源县| 体育| 融水| 盐源县| 商河县| 额济纳旗| 绥德县| 临澧县| 关岭| 郓城县| 灵台县| 宿州市| 疏勒县| 乐安县| 汽车| 彰武县| 鄢陵县| 沛县| 和静县| 宝应县| 涡阳县| 揭阳市| 万盛区| 上饶县| 东港市| 孝义市| 密云县| 和龙市| 正蓝旗| 葵青区| 沙湾县| 乐业县| 炉霍县|