国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Spring Boot 序列化、反序列化

這篇具有很好參考價值的文章主要介紹了Spring Boot 序列化、反序列化。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Spring Boot 序列化、反序列化

1. 簡介

在軟件開發(fā)中,序列化和反序列化是一種將對象轉(zhuǎn)換為字節(jié)流以便存儲或傳輸?shù)臋C(jī)制。序列化將對象轉(zhuǎn)換為字節(jié)流,而反序列化則將字節(jié)流轉(zhuǎn)換為對象。序列化和反序列化在許多應(yīng)用場景中都起著重要的作用,比如在網(wǎng)絡(luò)通信中傳輸對象、將對象存儲到數(shù)據(jù)庫中、實現(xiàn)分布式緩存等。

2. Java中的序列化和反序列化

Java提供了默認(rèn)的序列化機(jī)制,可以通過實現(xiàn)Serializable接口來實現(xiàn)對象的序列化和反序列化。序列化的過程是將對象轉(zhuǎn)換為字節(jié)流,可以通過ObjectOutputStream類來實現(xiàn);反序列化的過程是將字節(jié)流轉(zhuǎn)換為對象,可以通過ObjectInputStream類來實現(xiàn)。在進(jìn)行序列化和反序列化時,需要注意一些事項,比如版本控制、字段的訪問控制等。

import java.io.*;

public class SerializationDemo {
    public static void main(String[] args) {
        // 序列化對象
        try {
            // 創(chuàng)建一個對象
            User user = new User("John", 25);
            // 創(chuàng)建一個輸出流
            FileOutputStream fileOut = new FileOutputStream("user.ser");
            // 創(chuàng)建一個對象輸出流
            ObjectOutputStream out = new ObjectOutputStream(fileOut);
            // 將對象寫入輸出流
            out.writeObject(user);
            // 關(guān)閉流
            out.close();
            fileOut.close();
            System.out.println("Serialized data is saved in user.ser");
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 反序列化對象
        try {
            // 創(chuàng)建一個輸入流
            FileInputStream fileIn = new FileInputStream("user.ser");
            // 創(chuàng)建一個對象輸入流
            ObjectInputStream in = new ObjectInputStream(fileIn);
            // 從輸入流中讀取對象
            User user = (User) in.readObject();
            // 關(guān)閉流
            in.close();
            fileIn.close();
            // 輸出對象的屬性
            System.out.println("Name: " + user.getName());
            System.out.println("Age: " + user.getAge());
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

class User implements Serializable {
    private String name;
    private int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

3. Spring Boot中的序列化和反序列化

在Spring Boot中,默認(rèn)使用Jackson庫進(jìn)行JSON的序列化和反序列化??梢酝ㄟ^配置文件或注解來自定義序列化和反序列化的規(guī)則。比如,可以使用@JsonSerialize注解來指定對象的序列化規(guī)則,使用@JsonDeserialize注解來指定對象的反序列化規(guī)則。

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;

@SpringBootApplication
public class SerializationApplication {

    public static void main(String[] args) {
        SpringApplication.run(SerializationApplication.class, args);
    }

    @Bean
    public Jackson2ObjectMapperBuilderCustomizer customizer() {
        return new Jackson2ObjectMapperBuilderCustomizer() {
            @Override
            public void customize(Jackson2ObjectMapperBuilder builder) {
                builder.serializationInclusion(JsonInclude.Include.NON_NULL);
                builder.visibility(JsonAutoDetect.Visibility.ANY);
            }
               };
    }

    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        return objectMapper;
    }
}

4. 序列化和反序列化的安全性問題

序列化和反序列化操作可能存在安全漏洞,攻擊者可以通過構(gòu)造惡意的序列化數(shù)據(jù)來執(zhí)行任意代碼。這種攻擊被稱為"序列化漏洞"。為了防止序列化漏洞,可以采取以下措施:

  • 使用白名單機(jī)制,限制可以反序列化的類;
  • 對反序列化的數(shù)據(jù)進(jìn)行校驗,確保數(shù)據(jù)的完整性和安全性;
  • 使用安全的序列化庫,如Google的Protobuf。

在Spring Boot中,可以通過配置來增強(qiáng)序列化和反序列化的安全性。比如,可以禁用默認(rèn)的序列化機(jī)制,限制可以反序列化的類,或者使用安全的序列化庫。

5. 序列化和反序列化的最佳實踐

在實際應(yīng)用中,選擇合適的序列化和反序列化方式非常重要。以下是一些最佳實踐:

  • 盡量使用標(biāo)準(zhǔn)的序列化機(jī)制,如Java的序列化機(jī)制或JSON序列化;
  • 對于復(fù)雜的對象,考慮使用自定義的序列化和反序列化規(guī)則;
  • 注意對象的版本控制,避免出現(xiàn)不兼容的問題;
  • 進(jìn)行性能評估,選擇性能較好的序列化方式。

6. 總結(jié)

序列化和反序列化是一種重要的機(jī)制,在軟件開發(fā)中起著重要的作用。本文介紹了Java中的序列化和反序列化機(jī)制,以及在Spring Boot中的應(yīng)用。同時,還討論了序列化和反序列化的安全性問題和最佳實踐。希望本文對讀者在實際開發(fā)中的序列化和反序列化問題有所幫助。文章來源地址http://www.zghlxwxcb.cn/news/detail-617983.html

7. 參考文獻(xiàn)

  • Java Serialization
  • Spring Boot Reference Guide
  • Serialization and Deserialization in Java
  • Secure Coding Guidelines for Java SE

到了這里,關(guān)于Spring Boot 序列化、反序列化的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Spring反序列化JNDI分析

    Spring反序列化JNDI分析

    Spring框架的 JtaTransactionManager 類中重寫了 readObject 方法,這個方法最終會調(diào)用到JNDI中的 lookup() 方法,關(guān)鍵是里面的參數(shù)可控,這就導(dǎo)致了攻擊者可以利用JNDI注入中的lookup()參數(shù)注入,傳入惡意URI地址指向攻擊者的RMI注冊表服務(wù),以使受害者客戶端加載綁定在攻擊者RMI注冊表服

    2024年04月08日
    瀏覽(16)
  • 【中?!縎pring Kafka 反序列化漏洞 (CVE-2023-34040)

    【中?!縎pring Kafka 反序列化漏洞 (CVE-2023-34040)

    zhi.oscs1024.com????? 漏洞類型 反序列化 發(fā)現(xiàn)時間 2023-08-24 漏洞等級 中危 MPS編號 MPS-fed8-ocuv CVE編號 CVE-2023-34040 漏洞影響廣度 小 OSCS 描述 Spring Kafka?是 Spring Framework 生態(tài)系統(tǒng)中的一個模塊,用于簡化在 Spring 應(yīng)用程序中集成 Apache Kafka 的過程,記錄(record)指 Kafka 消息中的一

    2024年02月11日
    瀏覽(53)
  • 【Java 基礎(chǔ)篇】Java序列化與反序列化詳解

    在Java中,序列化和反序列化是一種將對象轉(zhuǎn)換為字節(jié)流和將字節(jié)流轉(zhuǎn)換為對象的機(jī)制。通過序列化,可以將對象存儲到文件中、傳輸?shù)骄W(wǎng)絡(luò)上,或者在分布式系統(tǒng)中進(jìn)行對象的傳遞。本文將詳細(xì)介紹Java序列化和反序列化的原理、使用方法和常見應(yīng)用場景,并提供一些示例代

    2024年02月09日
    瀏覽(24)
  • Java安全基礎(chǔ)之Java序列化與反序列化

    目錄 ObjectInputStream 和 ObjectOutputStream java.io.Serializable 自定義序列化和反序列化 Java 的序列化(Serialization)是指將對象轉(zhuǎn)換為字節(jié)序列的過程,而反序列化(Deserialization)則是將字節(jié)序列轉(zhuǎn)換回對象的過程。 序列化和反序列化通常用于在網(wǎng)絡(luò)上傳輸對象或者將對象持久化到文

    2024年04月22日
    瀏覽(18)
  • Java序列化和反序列化

    目錄 一、序列化和反序列化 二、Java序列化演示 三、反序列化漏洞 1、含義 ?序列化就是內(nèi)存中的對象寫入到IO流中,保存的格式可以是二進(jìn)制或者文本內(nèi)容。反序列化就是IO流還原成對象。 2、用途 (1)傳輸網(wǎng)絡(luò)對象 (2)保存Session 1、序列化 java.io.ObjectOutputStream代表對象

    2023年04月25日
    瀏覽(26)
  • Java序列化和反序列化機(jī)制

    在閱讀 ArrayList 源碼的時候,注意到,其內(nèi)部的成員變量動態(tài)數(shù)組 elementData 被Java中的 transient 修飾 transient 意味著Java在序列化時會跳過該字段(不序列化該字段) 而Java在默認(rèn)情況下會序列化類(實現(xiàn)了 Java.io.Serializable 接口的類)的所有非瞬態(tài)(未被 transient 修飾

    2024年03月15日
    瀏覽(27)
  • java中的序列化和反序列化

    objectOutputStream 對象的序列化,以流的形式將對象寫入文件 構(gòu)造方法: objectOutputStream(OutputStream out) 傳入一個字節(jié)輸入流創(chuàng)建objectOutputStream對象 成員方法: void writeObject(object obj) 將指定的對象寫入objectOutputStream 使用步驟: 創(chuàng)建一個類,這個類實現(xiàn)Serializable接口,Serializable是一

    2024年02月14日
    瀏覽(19)
  • Java中序列化和反序列化解釋

    在Java中,序列化(Serialization)是指將對象的狀態(tài)轉(zhuǎn)換為字節(jié)流的過程,以便將其保存到文件、在網(wǎng)絡(luò)中傳輸或持久化到數(shù)據(jù)庫中。而反序列化(Deserialization)則是將字節(jié)流轉(zhuǎn)換回對象的過程,恢復(fù)對象的狀態(tài)。 序列化和反序列化主要用于以下場景: 1. 對象持久化:通過序列

    2024年02月07日
    瀏覽(23)
  • Java 反序列化之 XStream 反序列化

    XStream 是一個簡單的基于 Java 庫,Java 對象序列化到 XML,反之亦然(即:可以輕易的將 Java 對象和 XML 文檔相互轉(zhuǎn)換)。 下面看下如何使用 XStream 進(jìn)行序列化和反序列化操作的。 先定義接口類 IPerson.java 接著定義 Person 類實現(xiàn)前面的接口: XStream 序列化是調(diào)用? XStream.toXML() ?來實

    2024年02月10日
    瀏覽(17)
  • [Java反序列化]—Shiro反序列化(一)

    [Java反序列化]—Shiro反序列化(一)

    IDEA搭建shiro550復(fù)現(xiàn)環(huán)境_普通網(wǎng)友的博客-CSDN博客 Apache Shiro框架提供了記住密碼的功能(RememberMe),用戶登錄成功后會生成經(jīng)過加密并編碼的cookie。在服務(wù)端對rememberMe的cookie值,先base64解碼然后AES解密再反序列化,就導(dǎo)致了反序列化RCE漏洞。 那么,Payload產(chǎn)生的過程: 命令

    2024年02月06日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包