在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Java序列化怎么使用

科技綠洲 ? 來(lái)源:Java技術(shù)指北 ? 作者:Java技術(shù)指北 ? 2023-10-10 14:19 ? 次閱讀

java 對(duì)象經(jīng)常需要在網(wǎng)絡(luò)中以 socket 傳輸或者需要保存到文件中。這時(shí)不管 java 對(duì)象是文件、數(shù)據(jù)、圖像還是其他格式,都可以轉(zhuǎn)換為一個(gè) byte[] 數(shù)組保存到文件或者通過(guò)網(wǎng)絡(luò)傳輸。這種轉(zhuǎn)換方式就叫做序列化。將文件或者網(wǎng)絡(luò)傳輸中得到的 byte[] 數(shù)組轉(zhuǎn)換為 java 對(duì)象就叫做反序列化。

怎么使用

如果一個(gè) Java 對(duì)象要能被序列化,必須實(shí)現(xiàn)一個(gè)特殊的 java.io.Serializable 接口

public interface Serializable {
}

Serializable 接口沒(méi)有定義任何的方法,是一個(gè)空接口。為什么要有一個(gè)這樣的接口?主要是因?yàn)榘踩H绻麤](méi)有這個(gè)接口就代表著所有 java 對(duì)象都可以被序列化到磁盤上,然后通過(guò)反序列化看到所有屬性的數(shù)據(jù)。有了這個(gè) Serializable 就可以讓開(kāi)發(fā)人員選擇 java 對(duì)象可以被序列化和反序列化,就增加了安全性。

序列化

下面例子是將一個(gè) java 對(duì)象序列化后保存到文件。

import java.io.Serializable;

public class Order  implements Serializable {

    private Long orderId;
    private String orderNo;
    private String consignee;//收件人
    private String deliveryAddress;//收貨地址

    //getter 和 setter

    @Override
    public String toString() {
        return "OrderDTO{" +
                "orderId=" + orderId +
                ", orderNo='" + orderNo + ''' +
                ", consignee='" + consignee + ''' +
                ", deliveryAddress='" + deliveryAddress + ''' +
                '}';
    }
}

把一個(gè) Java 對(duì)象變?yōu)?byte[] 數(shù)組,需要使用 ObjectOutputStream。它負(fù)責(zé)把一個(gè)Java 對(duì)象寫(xiě)入一個(gè)字節(jié)流:

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;

public class Test {

    public static void main(String[] args) throws Exception {
        OrderDTO orderDTO = new OrderDTO();
        orderDTO.setOrderId(1L);
        orderDTO.setOrderNo("123456");
        orderDTO.setConsignee("李四");
        orderDTO.setDeliveryAddress("xxx路xxx弄xxxx號(hào)");

        OrderDTO orderDTO2 = new OrderDTO();
        orderDTO2.setOrderId(2L);
        orderDTO2.setOrderNo("78901");
        orderDTO2.setConsignee("王五");
        orderDTO2.setDeliveryAddress("yyy路yyy弄yyyy號(hào)");

        List< OrderDTO > list = new ArrayList<  >();
        list.add(orderDTO);
        list.add(orderDTO2);

        FileOutputStream fos = new FileOutputStream("D:/order.txt");
        try ( ObjectOutputStream os = new ObjectOutputStream(fos)){
            os.writeObject(list);
        }
        System.out.println("序列化成功");
    }
}

這個(gè)時(shí)候就將兩個(gè) OrderDTO 對(duì)象序列化到了 D:/order.txt 中。

反序列化

序列化文件在本地打開(kāi)都是亂碼的,這應(yīng)該用反序列化將文件解析成對(duì)象。

import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.util.ArrayList;
import java.util.List;

public class Test {

    public static void main(String[] args) throws Exception {

        List< OrderDTO > list = new ArrayList<  >();
        FileInputStream fis = new FileInputStream("D:/order.txt");
        try (ObjectInputStream is = new ObjectInputStream(fis)) {
            list = (List< OrderDTO >)is.readObject();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        for (OrderDTO orderDTO : list){
            System.out.println(orderDTO.toString());
        }

    }
}

輸出結(jié)果:

OrderDTO{orderId=1, orderNo='123456', consignee='李四', deliveryAddress='xxx路xxx弄xxxx號(hào)'}
OrderDTO{orderId=2, orderNo='78901', consignee='王五', deliveryAddress='yyy路yyy弄yyyy號(hào)'}

注意點(diǎn)

  1. 靜態(tài)變量和 transient 關(guān)鍵字修飾的變量不能被序列化
  2. 反序列化的時(shí)候,字節(jié)流中的 serialVersionUID 和實(shí)體類中的 serialVersionUID 的不一致會(huì)拋出異常。serialVersionUID 沒(méi)有寫(xiě)的話,會(huì)被默認(rèn)一個(gè)。
  3. 序列化實(shí)現(xiàn)了深克隆,對(duì)象引用的每一個(gè)對(duì)象數(shù)據(jù)也會(huì)被序列化。

總結(jié)

  1. 序列化必須實(shí)現(xiàn) Serializable。
  2. serialVersionUID 不是必須的。
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8712

    瀏覽量

    152014
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7168

    瀏覽量

    89692
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2976

    瀏覽量

    105211
  • 網(wǎng)絡(luò)
    +關(guān)注

    關(guān)注

    14

    文章

    7600

    瀏覽量

    89303
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    如何使用Serde進(jìn)行序列化和反序列化

    Serde 是一個(gè)用于序列化和反序列化 Rust 數(shù)據(jù)結(jié)構(gòu)的庫(kù)。它支持 JSON、BSON、YAML 等多種格式,并且可以自定義序列化和反序列化方式。Serde 的特點(diǎn)是代碼簡(jiǎn)潔、易于
    的頭像 發(fā)表于 09-30 17:09 ?1394次閱讀

    Java序列化的機(jī)制和原理

    本文講解了Java序列化的機(jī)制和原理。從文中你可以了解如何序列化一個(gè)對(duì)象,什么時(shí)候需要序列化以及Java
    發(fā)表于 07-10 07:27

    c語(yǔ)言序列化和反序列化有何區(qū)別

    這里寫(xiě)自定義目錄標(biāo)題c語(yǔ)言序列化和反序列化tplut.htplut.c測(cè)試代碼參考c語(yǔ)言序列化和反序列化網(wǎng)絡(luò)調(diào)用,數(shù)據(jù)傳輸都需要把數(shù)據(jù)序列化
    發(fā)表于 07-14 07:32

    關(guān)于c語(yǔ)言序列化和反序列化的知識(shí)點(diǎn)看完你就懂了

    關(guān)于c語(yǔ)言序列和反序列化的知識(shí)點(diǎn)你就懂了
    發(fā)表于 10-15 08:47

    SpringMVC JSON框架的自定義序列化與反序列化

    ,也可以使用fastjson。jackson框架自定義序列化如果項(xiàng)目使用jackson框架做json序列化,推薦的方案是使用@JsonSerialize注解,示例代碼如下:@JsonSerialize
    發(fā)表于 10-10 16:02

    Java對(duì)象序列化您不知道的5件事

    本文是本系列的第一篇文章,這個(gè)系列專門揭示關(guān)于 Java 平臺(tái)的一些有用 的小知識(shí) — 這些小知識(shí)不易理解,但對(duì)于解決 Java 編程挑戰(zhàn)遲早有用。 將 Java 對(duì)象序列化 API
    發(fā)表于 11-23 17:53 ?20次下載

    理解PHP反序列化漏洞

    理解PHP反序列化漏洞
    發(fā)表于 09-07 11:03 ?7次下載
    理解PHP反<b class='flag-5'>序列化</b>漏洞

    java序列化和反序列化范例和JDK類庫(kù)中的序列化API

    一、序列化和反序列化的概念 把對(duì)象轉(zhuǎn)換為字節(jié)序列的過(guò)程稱為對(duì)象的序列化。 把字節(jié)序列恢復(fù)為對(duì)象的過(guò)程稱為對(duì)象的反
    發(fā)表于 09-27 10:13 ?6次下載

    java序列化的幾種方式

    一.Java序列化的作用 有的時(shí)候我們想要把一個(gè)Java對(duì)象變成字節(jié)流的形式傳出去,有的時(shí)候我們想要從一個(gè)字節(jié)流中恢復(fù)一個(gè)Java對(duì)象。例如,有的時(shí)候我們想要 把一個(gè)
    發(fā)表于 09-27 11:15 ?0次下載

    static屬性為什么不會(huì)被序列化

    實(shí)現(xiàn)序列化和反序列化為什么要實(shí)現(xiàn)Serializable接口?
    的頭像 發(fā)表于 07-15 11:03 ?1825次閱讀

    Java序列化回顯方法

    同樣修改yso中Gadgets要執(zhí)行的java代碼即可實(shí)現(xiàn),通過(guò)將執(zhí)行結(jié)果寫(xiě)入web目錄下的靜態(tài)文件再讀取來(lái)實(shí)現(xiàn)。此法的缺點(diǎn)是當(dāng)目標(biāo)不存在可訪問(wèn)靜態(tài)web目錄便無(wú)法使用了且要獲取web目錄的絕對(duì)路徑,更適用于已知開(kāi)發(fā)框架的反序列化漏洞利用。
    的頭像 發(fā)表于 03-07 10:58 ?1222次閱讀

    什么是序列化 為什么要序列化

    什么是序列化? “序列化”(Serialization )的意思是將一個(gè)對(duì)象轉(zhuǎn)化為字節(jié)流。 這里說(shuō)的對(duì)象可以理解為“面向?qū)ο蟆崩锏哪莻€(gè)對(duì)象,具體的就是存儲(chǔ)在內(nèi)存中的對(duì)象數(shù)據(jù)。 與之相反的過(guò)程是“反序列化
    的頭像 發(fā)表于 09-14 17:22 ?2716次閱讀
    什么是<b class='flag-5'>序列化</b> 為什么要<b class='flag-5'>序列化</b>

    ROS中的序列化實(shí)現(xiàn)

    理解了序列化,再回到ROS。我們發(fā)現(xiàn),ROS沒(méi)有采用第三方的序列化工具,而是選擇自己實(shí)現(xiàn),代碼在roscpp_core項(xiàng)目下的roscpp_serialization中,見(jiàn)下圖。這個(gè)功能涉及的代碼量
    的頭像 發(fā)表于 09-14 17:26 ?964次閱讀

    如何用C語(yǔ)言進(jìn)行json的序列化和反序列化

    json是目前最為流行的文本數(shù)據(jù)傳輸格式,特別是在網(wǎng)絡(luò)通信上廣泛應(yīng)用,隨著物聯(lián)網(wǎng)的興起,在嵌入式設(shè)備上,也需要開(kāi)始使用json進(jìn)行數(shù)據(jù)傳輸,那么,如何快速簡(jiǎn)潔地用C語(yǔ)言進(jìn)行json的序列化和反序列化
    的頭像 發(fā)表于 10-07 11:05 ?1590次閱讀

    什么時(shí)候需要Boost序列化

    程序開(kāi)發(fā)中,序列化是經(jīng)常需要用到的。像一些相對(duì)高級(jí)語(yǔ)言,比如JAVA, C#都已經(jīng)很好的支持了序列化,那么C++呢?當(dāng)然一個(gè)比較好的選擇就是用Boost,這個(gè)號(hào)稱C++準(zhǔn)標(biāo)準(zhǔn)庫(kù)的東西。 什么時(shí)候需要
    的頭像 發(fā)表于 11-10 10:14 ?469次閱讀
    主站蜘蛛池模板: 美女久久久久久 | 日韩欧美亚洲综合久久影院d3 | 91精品国产亚洲爽啪在线影院 | 中文一级黄色片 | 成年女人在线观看 | 午夜性视频 | 黄色录像三级 | 久久久午夜精品理论片 | 好大好硬好爽免费视频 | 天堂在线观看 | 伊人亚洲综合网成人 | 女同在线视频 | 国产精品三级国语在线看 | 国产成人mv在线观看入口视频 | 亚洲第一色图 | 伊人网网 | 伊人97在线| 国产一级特黄aa级特黄裸毛片 | 性欧美高清久久久久久久 | 午夜视频国产 | 天天操伊人 | 午夜噜噜噜私人影院在线播放 | a亚洲天堂| ccav在线永久免费看 | 日本在线视 | 人人干在线| 99热最新网址 | 国产欧美久久久精品影院 | 四虎影院黄色 | 免费观看黄色网页 | 女同性进行性行为视频 | 人人干视频 | 全色网站 | 色视频在线网站 | 欧美区亚洲区 | 一级做α爰片久久毛片 | 色偷偷综合 | 一级片免费在线观看视频 | 欧美中出 | 久久久久久久国产精品影院 | 一本到卡二卡三卡免费高 |