最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java序列化和反序列化示例介紹

 更新時間:2022年01月06日 09:46:55   作者:Black·Tea  
大家好,本篇文章主要講的是Java序列化和反序列化示例介紹,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽

以前用序列化都是一些方法需要才實現(xiàn)的,后來業(yè)務(wù)需求要深拷貝才去研究。參閱了別人博客得出一些總結(jié)。

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

存儲方便:因為對象會被回收,序列化后可以持續(xù)化存儲在磁盤中
傳輸方便:字節(jié)序列(二進(jìn)制形式)可以進(jìn)行網(wǎng)絡(luò)傳輸和傳播。

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

import lombok.Data;

import java.io.Serializable;

@Data
public class Student implements Serializable {
    private Integer id;
    private String name;
    private String sex;
}
然后創(chuàng)建一個測試類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;
    }
}
執(zhí)行結(jié)果:
序列化成功
反序列化成功
name:張三
sex:male
這個時候沒有指定SerialversionUID也是可以成功的,但對象->序列化->存儲或傳輸->反序列化,咱們在反序列化操作之前對Student類修改呢?

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

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;
//    }
}
運行結(jié)果:
序列化成功

修改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;
}
注釋掉序列化方法,進(jìn)行反序列化
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;
    }
}
執(zhí)行結(jié)果:
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
可以看出兩次的執(zhí)行的SerialversionUID不匹配,導(dǎo)致產(chǎn)生java.io.InvalidClassException異常,所以只要指定了SerialversionUID就不會報異常。
//指定serialVersionUID正確寫法
private static final long serialVersionUID = 3846952599709361171L;

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

最后需要知道的一點就是字節(jié)流字符流的區(qū)別。
字節(jié)流:傳輸過程中,傳輸數(shù)據(jù)的最基本單位是字節(jié)的流。
字符流:傳輸過程中,傳輸數(shù)據(jù)的最基本單位是字符的流。

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

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

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

Unicode 編碼中,一個英文為一個字節(jié),一個中文為兩個字節(jié)。

符號:英文標(biāo)點為一個字節(jié),中文標(biāo)點為兩個字節(jié)。例如:英文句號 . 占1個字節(jié)的大小,中文句號 。

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

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

到此這篇關(guān)于Java序列化和反序列化示例介紹的文章就介紹到這了,更多相關(guān)Java序列化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java并發(fā)編程實例分析

    java并發(fā)編程實例分析

    在本文里我們給大家分享了關(guān)于java并發(fā)編程實例分析以及相關(guān)知識點,需要的朋友們學(xué)習(xí)下。
    2019-03-03
  • Java使用DateTimeFormatter格式化輸入的日期時間

    Java使用DateTimeFormatter格式化輸入的日期時間

    這篇文章主要介紹了Java使用DateTimeFormatter格式化輸入的日期時間,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • SpringBoot啟動后自動執(zhí)行初始化任務(wù)的五種方法

    SpringBoot啟動后自動執(zhí)行初始化任務(wù)的五種方法

    在 Spring Boot 開發(fā)中,我們經(jīng)常需要在應(yīng)用啟動后立即執(zhí)行初始化任務(wù),本文將深度解析 ??5 種主流實現(xiàn)方案??,大家可以根據(jù)自己的需求自行選擇
    2025-04-04
  • Java 實戰(zhàn)范例之進(jìn)銷存管理系統(tǒng)的實現(xiàn)

    Java 實戰(zhàn)范例之進(jìn)銷存管理系統(tǒng)的實現(xiàn)

    讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+vue+Springboot+ssm+mysql+maven+redis實現(xiàn)一個前后端分離的進(jìn)銷存管理系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平
    2021-11-11
  • MyBatis?動態(tài)SQL使用及原理

    MyBatis?動態(tài)SQL使用及原理

    這篇文章主要為大家介紹了MyBatis動態(tài)SQL使用及原理的學(xué)習(xí)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • springbootAOP定義切點獲取/修改請求參數(shù)方式

    springbootAOP定義切點獲取/修改請求參數(shù)方式

    這篇文章主要介紹了springbootAOP定義切點獲取/修改請求參數(shù)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Java報錯Java.text.ParseException的解決方法匯總

    Java報錯Java.text.ParseException的解決方法匯總

    在Java開發(fā)的復(fù)雜世界中,錯誤處理是開發(fā)者必須面對的關(guān)鍵挑戰(zhàn)之一,其中,Java.text.ParseException就像一個隱藏在代碼叢林中的陷阱,常常讓開發(fā)者們陷入困惑,本文給大家介紹了Java報錯Java.text.ParseException的解決方法,需要的朋友可以參考下
    2024-10-10
  • 深入淺析 Spring Boot Starter

    深入淺析 Spring Boot Starter

    Spring框架功能很強(qiáng)大,但是就算是一個很簡單的項目,我們也要配置很多東西。接下來通過本文給大家分享Spring Boot Starter 知識,感興趣的朋友一起看看吧
    2017-10-10
  • spring中@Autowired自動注入依賴項的使用

    spring中@Autowired自動注入依賴項的使用

    當(dāng)使用@Autowired注解時,它可以自動注入依賴項,例如其他類的實例,本文就來詳細(xì)的介紹一下,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • java實現(xiàn)多人多牌數(shù)比較游戲

    java實現(xiàn)多人多牌數(shù)比較游戲

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)多人多牌數(shù)比較游戲,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01

最新評論

伽师县| 永康市| 鄂温| 双流县| 防城港市| 会昌县| 海兴县| 孝昌县| 福贡县| 文昌市| 淮北市| 聂拉木县| 余姚市| 漳州市| 吴旗县| 林芝县| 肇庆市| 如东县| 广安市| 普陀区| 乐业县| 华蓥市| 孝昌县| 武山县| 江孜县| 内黄县| 峨眉山市| 景泰县| 汾西县| 定州市| 闻喜县| 浙江省| 天镇县| 平潭县| 汉中市| 常熟市| 岱山县| 蓬莱市| 郸城县| 延庆县| 漳州市|