1. 程式人生 > >java序列化與反序列化中transient和static成員剖析

java序列化與反序列化中transient和static成員剖析

在我的上一篇博文中講解了一些基本的關於java序列化與反序列化的問題,現在我們一起來對物件中宣告為transient和static的變數進行解析。

1:類中宣告為transient變數

一旦類中某個變數宣告為transient,則會告訴JVM,你不用幫我序列化該變數,我自己來進行序列化。將資料成員宣告為transient後,序列化過程就無法將其加進物件位元組流中,沒有從transient資料成員傳送的資料。後面資料反序列化時,要重建資料成員(因為它是類定義的一部分),但不包含任何資料,因為這個資料成員不向流中寫入任何資料。記住,物件流不序列化。

還是上一篇博文程式碼,只是name屬性中多加了個static,測試大媽如下:

package com.test;
import java.io.*;
public class Person implements Serializable {
    private static String name = "";//在這裡和之前的有變動,多了個static
    public Person(){
        name = "高中同學都叫我ROBIN";
    }
    public Person(String name){
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    

    public static void main(String[] args) {
        Person person =new Person();
//File file = new File("H:\\test.txt");//建議用File.separator
        try {
            
            FileOutputStream fos = new FileOutputStream("test.out");//暫存內容

            ObjectOutputStream oos = new ObjectOutputStream(fos);

            System.out.println(" 1> " + person.getName());

            person.setName("我為自己代言!!!");                       

            oos.writeObject(person);

            oos.close();                       

    } catch (Exception ex) {  ex.printStackTrace();   }

    try {

            FileInputStream fis = new FileInputStream("test.out");

            ObjectInputStream ois = new ObjectInputStream(fis);

            person = (Person) ois.readObject();

            System.out.println(" 2> " + person.getName());

            ois.close();

    } catch (Exception ex) {

            ex.printStackTrace();

    }
    
    }

}

測試結果如下:

我上面不是說了嗎static變數是不能狗被序列化的,按道理反序列化中呼叫getName方法輸出結果應該也是和第一句話一樣的啊!這到底是怎麼了,難道我說的不對,看編譯出的結果我也納悶了,後來我在網上查了下,有一個答案解決了我的謎底:

那就是靜態成員屬於類級別的,所以不能序列化,這個之前我們都知道了。這裡的不能序列化的意思,是序列化資訊中不包含這個靜態成員域為什麼測試成功,是因為我是在同一個機器(而且是同一個程序),因為我的jvm已經把name變數載入進來了,所以我獲取的是載入好的name,如果我把該變數傳到另一臺機器別的機器是不能狗得到後一個設定name值的,也就是圖片中的第二個值而是兩個值一樣。

但也有些學過c++或則java的人會說,靜態變數雖然術語類的,那為什麼c++或則中還可以用物件.方法進行呼叫,雖然可以但程式還是會轉換成進行類名.方法進行呼叫,而我序列化是序列化物件,所以跟說明了static不能狗被序列化緣由。

至於transient原理是和static一樣的,就不多說了。

相關推薦

java序列序列transientstatic成員剖析

在我的上一篇博文中講解了一些基本的關於java序列化與反序列化的問題,現在我們一起來對物件中宣告為transient和static的變數進行解析。 1:類中宣告為transient變數 一旦類中某個變數宣告為transient,則會告訴JVM,你不用幫我序列化該變數,我自己

java序列序列的問題

java序列化是將java物件轉換為位元組序列的過程,變成計算機能夠儲存的二進位制序列       反序列化是將位元組序列恢復成java物件的過程 1.當兩個Java程序進行通訊時,能否實現程序間的物件傳送呢?答案是可以的。如何做到呢?這就需要Java序列化與反

java序列序列

序列化與反序列化 一 、什麼是序列化與反序列化 把物件轉換為位元組序列的過程稱為物件的序列化。 把位元組序列恢復為物件的過程稱為物件的反序列化 一個物件只要實現了Serilizable介面,這個物件就可以被序列化,java的這種序列化模式為開發者提供了很多便利

java序列序列

       把物件轉換為位元組序列的過程稱為物件的序列化。   把位元組序列恢復為物件的過程稱為物件的反序列化。   物件的序列化主要有兩種用途:   1) 把物件的位元組序列永久地儲存到硬碟上,通常存放在一個檔案中;   2) 在網路上傳送物件的位元組序列

Java的基礎----序列序列的作用

Java提供兩種物件持久化的方式,分別序列化和外部序列化。 1)序列化(Serialization):         在分散式環境下,無論是何種資料,都會以二進位制序列的形式在網路上傳輸。序列化是一種將物件以一連串的位元組描述的過程,用於解決在對物件流進行讀寫操作時

Java資料通訊使用Google Protobuf實現序列序列

一、.什麼是protocol buffer        ProtocolBuffer是用於結構化資料序列化的靈活、高效、自動的方法,有如XML,不過它更小、更快、也更簡單。你可以定義自己的資料結構,然後使用程式碼生成器生成的程式碼來讀寫這個資料結構。你甚至可以在無需重新

有關java物件序列序列的亂碼問題

在一開始學習java流操作中的有關物件序列化與非序列化的時候,很多初學者會糾結於寫出的檔案出現亂碼的問題。 以下是有關序列化與反序列化的相關程式碼。 第一步:先建立相關的物件。package day02; import java.io.Serializable; impo

Java 序列序列

一、 序列化和反序列化概念 Serialization(序列化)是一種將物件以一連串的位元組描述的過程;反序列化deserialization是一種將這些位元組重建成一個物件的過程。將程式中的物件,放入檔案中儲存就是序列化,將檔案中的位元組碼重新轉成物件就是反序列化。 二、 序列化和反序列化的必要性 當兩個程

Java核心類庫-IO-對象流(實現序列序列

.get throws 反序 code row cts new java cep 使用對象流來完成序列化和反序列化操作:   ObjectOutputStream:通過writeObject()方法做序列化操作的   ObjectInputStream:通過readObje

Java IO-5 序列序列

str ride log getname file urn turn objects transient 建一個Person類 1 package demo05; 2 3 import java.io.Serializable; 4 5 public cla

Java序列序列

setname [] 進制 方式 gets 創建 保存 ati 取數據 Java序列化與反序列化是什麽?為什麽需要序列化與反序列化?如何實現Java序列化與反序列化?本文圍繞這些問題進行了探討。 1.Java序列化與反序列化 Java序列化是指把Java對象轉換為字節序

asp.net mvc如何處理字符串對象之間的序列序列(一)

osi strong 類結構 plain pbo edate inf esc arp 前臺我們一般用ajax來發送數據到後端進行處理,如果json數據結構和後臺的實體類結構一致,就直接可以反序列化為指定的對象進行操作,非常方便。 前端發送的json數據結構: 後端實體結

Java將對象寫入文件讀出——序列序列

ansi print 成員 trace 對象的引用 ack lose 靜態 spa Java類中對象的序列化工作是通過ObjectOutputStream和ObjectInputStream來完成的。 寫入: 1 File aFile=new File(

01. Java對象的序列序列簡介

語音 log -c object height 通訊 圖片 二進制 進程    Java對象的序列化與反序列化 ; 給大家講解一下什麽是序列化 & 反序列化      當兩個進程進行遠程通訊的時候,彼此相互可以發送各種類型的數據,如文本,圖片,語音和視頻等無論是任何

python序列序列

tmp 數據類型 load 一個 port style pick 序列 spa 之前,在學習python時,一直弄不明白pickle和json模塊的序列化和反序例化之間的區別和用法,最近閑來有時間,重新研究了這兩個模塊,也算是基本搞明白他們之中的區別了。 用於序列化的兩個模

JAVA基礎之序列序列

步驟 per 文件 color 字節 [] ati input des 序列化和反序列化:   把對象轉化為字節序列的過程稱為序列化;   把字節序列恢復為對象的過程稱為對象的反序列化; 方法:   Java.io.ObjectOutputStream代表對象的輸出流,wr

Java基礎-IO流對象之序列序列

span 作者 創作 style -s 反序列化 ont 對象 io流                 Java基礎-IO流對象之序列化與反序列化                                     作者:尹正傑 版權聲明:原創作品,謝絕轉載!否則將追究

Apache Avro 序列序列 (Java 實現)

Avro像兩個交流一樣要找一個互相能理解的語言, 在國內為普通話, 跑國外多用英語相通, 兩個進程間通信也需要找一個大家都能理解的數據格式. 簡單的如 JSON, XML, 那是自我描述性格式, XML 有 Schema 定義, 但尚無正式的 JSON Schema 規範. 在講求效率的場合, 純文本式的數據

JSON 序列序列(-)泛型 及 java.lang.reflect.Type

限定 完成 ica 所有 void 數據類型 HR ble DC Type及其子接口的來歷 泛型出現之前的類型 沒有泛型的時候,只有原始類型。此時,所有的原始類型都通過字節碼文件類Class類進行抽象。Class類的一個具體對象就代表一個指定的原始類型。 泛型出現之後的類型

基礎 | Java序列序列的底層實現

在深拷貝與淺拷貝中,提到可以採用「序列化與反序列化」的方式來實現深拷貝,今天主要來填一下序列化的坑。 其中,序列化是一種物件持久化的手段,普遍應用於網路傳輸和遠端方法呼叫(RMI)等場景中,建議關注。 什麼是Java序列化和反序列化? 參考答案: 在Java中