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

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

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

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

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

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

最好設(shè)置一個(gè)SerialversionUID,因?yàn)樾蛄谢头葱蛄谢菍?duì)比SerialversionUID來(lái)進(jìn)行的,雖然不設(shè)置接口也會(huì)默認(rèn)生成一個(gè),但是要知道序列化對(duì)象過程一般都是對(duì)象->序列化->存儲(chǔ)或傳輸->反序列化。
舉個(gè)例子:
先創(chuàng)建一個(gè)實(shí)體類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)建一個(gè)測(cè)試類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
這個(gè)時(shí)候沒有指定SerialversionUID也是可以成功的,但對(duì)象->序列化->存儲(chǔ)或傳輸->反序列化,咱們?cè)诜葱蛄谢僮髦皩?duì)Student類修改呢?

這個(gè)時(shí)候咱們修改一下代碼,先注釋掉反序列化代碼,先進(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;
//    }
}
運(yùn)行結(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就不會(huì)報(bào)異常。
//指定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));

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

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

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

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

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

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

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

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

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

相關(guān)文章

  • 老生常談 Java中的繼承(必看)

    老生常談 Java中的繼承(必看)

    下面小編就為大家?guī)?lái)一篇老生常談 Java中的繼承(必看)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2017-07-07
  • Mybatis逆向工程運(yùn)行代碼實(shí)例

    Mybatis逆向工程運(yùn)行代碼實(shí)例

    這篇文章主要介紹了Mybatis逆向工程運(yùn)行代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Java+ElasticSearch+Pytorch實(shí)現(xiàn)以圖搜圖功能

    Java+ElasticSearch+Pytorch實(shí)現(xiàn)以圖搜圖功能

    這篇文章主要為大家詳細(xì)介紹了Java如何利用ElasticSearch和Pytorch實(shí)現(xiàn)以圖搜圖功能,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下
    2023-06-06
  • Spring?Boot項(xiàng)目如何優(yōu)雅實(shí)現(xiàn)Excel導(dǎo)入與導(dǎo)出功能

    Spring?Boot項(xiàng)目如何優(yōu)雅實(shí)現(xiàn)Excel導(dǎo)入與導(dǎo)出功能

    在我們平時(shí)工作中經(jīng)常會(huì)遇到要操作Excel的功能,比如導(dǎo)出個(gè)用戶信息或者訂單信息的Excel報(bào)表,下面這篇文章主要給大家介紹了關(guān)于Spring?Boot項(xiàng)目中如何優(yōu)雅實(shí)現(xiàn)Excel導(dǎo)入與導(dǎo)出功能的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • 詳解Spring Data JPA動(dòng)態(tài)條件查詢的寫法

    詳解Spring Data JPA動(dòng)態(tài)條件查詢的寫法

    本篇文章主要介紹了Spring Data JPA動(dòng)態(tài)條件查詢的寫法 ,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2017-06-06
  • IDEA生成patch和使用patch的方法實(shí)現(xiàn)

    IDEA生成patch和使用patch的方法實(shí)現(xiàn)

    比如你本地修復(fù)的 bug,需要把增量文件發(fā)給客戶,很多場(chǎng)景下大家都需要手工整理修改的文件,并整理好目錄,這個(gè)很麻煩,那有沒有簡(jiǎn)單的技巧呢?本文主要介紹了IDEA生成patch和使用patch的方法實(shí)現(xiàn),感興趣的可以了解一下
    2023-08-08
  • maven?grpc整合springboot?demo

    maven?grpc整合springboot?demo

    這篇文章主要為大家介紹了基于maven?grpc整合springboot?demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-04-04
  • Java微信退款開發(fā)

    Java微信退款開發(fā)

    這篇文章主要為大家詳細(xì)介紹了Java微信退款開發(fā)的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • java實(shí)現(xiàn)的密碼強(qiáng)度檢測(cè)功能完整示例

    java實(shí)現(xiàn)的密碼強(qiáng)度檢測(cè)功能完整示例

    這篇文章主要介紹了java實(shí)現(xiàn)的密碼強(qiáng)度檢測(cè)功能,結(jié)合完整實(shí)例形式分析了java針對(duì)密碼強(qiáng)度檢測(cè)相關(guān)的字符串遍歷、判斷,以及輸出密碼強(qiáng)度等級(jí)相關(guān)操作技巧,需要的朋友可以參考下
    2019-06-06
  • Java中使用輾轉(zhuǎn)相除法求最大公約數(shù)

    Java中使用輾轉(zhuǎn)相除法求最大公約數(shù)

    這篇文章主要介紹了Java中使用輾轉(zhuǎn)相除法求最大公約數(shù),本文直接給出代碼實(shí)例,需要的朋友可以參考下
    2015-05-05

最新評(píng)論