1. 程式人生 > >什麼是java序列化,如何實現java序列化?

什麼是java序列化,如何實現java序列化?

Java 序列化技術可以使你將一個物件的狀態寫入一個Byte 裡,並且可以從其它地方把該Byte 流裡的資料讀出來,重新構造一個相同的物件。這種機制允許你將物件通過網路進行傳播,並可以隨時把物件持久化到資料庫、檔案等系統裡。Java的序列化機制是RMI、EJB等技術的技術基礎。用途:利用物件的序列化實現儲存應用程式的當前工作狀態,下次再啟動的時候將自動地恢復到上次執行的狀態。

序列化就是一種用來處理物件流的機制,所謂物件流也就是將物件的內容進行流化。可以對流化後的物件進行讀寫操作,也可將流化後的物件傳輸於網路之間。序列化是為了解決在對物件流進行讀寫操作時所引發的問題。

序列化的實現:將需要被序列化的類實現Serializable

介面,然後使用一個輸出流(如:FileOutputStream)來構造一個ObjectOutputStream(物件流)物件,接著,使用ObjectOutputStream物件的writeObject(Object obj)方法就可以將引數為obj的物件寫出(即儲存其狀態),要恢復的話則用輸入流。

2、序列化的特點:

    (1)如果某個類能夠被序列化,其子類也可以被序列化。如果該類有父類,則分兩種情況來考慮,如果該父類已經實現了可序列化介面。則其父類的相應欄位及屬性的處理和該類相同;如果該類的父類沒有實現可序列化介面,則該類的父類所有的欄位屬性將不會序列化。

  (2)宣告為static

transient型別的成員資料不能被序列化。因為static代表類的狀態, transient代表物件的臨時資料;

  (3)相關的類和介面:在java.io包中提供的涉及物件的序列化的類與介面有ObjectOutput介面、ObjectOutputStream類、ObjectInput介面、ObjectInputStream類。

    (1)ObjectOutput介面:它繼承DataOutput介面並且支援物件的序列化,其內的writeObject()方法實現儲存一個物件。ObjectInput介面:它繼承DataInput介面並且支援物件的序列化,其內的readObject()方法實現讀取一個物件。

    (2)ObjectOutputStream類:它繼承OutputStream並且實現ObjectOutput介面。利用該類來實現將物件儲存(呼叫ObjectOutput介面中的writeObject()方法)。ObjectInputStream類:它繼承InputStream類並且實現ObjectInput介面。利用該類來實現讀取一個物件(呼叫ObjectInput介面中的readObject()方法)。

  對於父類的處理,如果父類沒有實現序列化介面,則其必須有預設的建構函式(即沒有引數的建構函式)。否則編譯的時候就會報錯。在反序列化的時候,預設建構函式被呼叫。但是若把父類標記為可以序列化,則在反序列化的時候,其預設建構函式不會被呼叫。這是為什麼呢?這是因為Java 對序列化的物件進行反序列化的時候,直接從流裡獲取其物件資料來生成一個物件例項,而不是通過其建構函式來完成。

import java.io.*;

public class Cat implements Serializable {

        private String name;

        public Cat () {

                this.name = "new cat";

        }

        public String getName() {

                return this.name;

        }

        public void setName(String name) {

                this.name = name;

        }

        public static void main(String[] args) {         

                Cat cat = new Cat();

                try {

                        FileOutputStream fos = new FileOutputStream("catDemo.out");

ObjectOutputStream oos = new ObjectOutputStream(fos);

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

                        cat.setName("My Cat");                       

                       oos.writeObject(cat);

                        oos.close();                       

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

                try {

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

ObjectInputStream ois = new ObjectInputStream(fis);

                        cat = (Cat) ois.readObject();

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

                        ois.close();

                } catch (Exception ex) {

                        ex.printStackTrace();

                }

        }

}//writeObject和readObject本身就是執行緒安全的,傳輸過程中是不允許被併發訪問的。所以物件能一個一個接連不斷的傳過來

相關推薦

Java - 物件複製cloneable與序列複製的區別

當需要對同一個類,生成多個物件時。一般有三種方法:new()、clone()、以及序列化複製 new和clone的區別,簡單的說一下: new的操作為 分配記憶體。程式執行到new操作符時, 首先去看new操作符後面的型別,因為知道了型別,才能知道要分配多大的記憶體空間。分配完記憶體之後,再

Java 抽象類可以間接實現例項無法直接例項

抽象類無法直接例項化, 它的例項化方式並不是通過普通的new方式來建立物件,而是通過父類的應用來指向子類的例項間接地實現父類的例項化,因為子類在例項化之前,一定會先例項化它的父類。這樣建立了繼承抽象類的子類物件,也就把其父類(抽象類)給例項化了。 注意:介面與抽象類非常類似,但是它不可以被例項化

正確的初始Java程式設計中至關重要!

有人說,你應該關注時事、財經,甚至流行的電影、電視劇,才有可能趁著熱點寫出爆文;有人說,你別再寫“無聊”的技術文了,因為程式設計師的圈子真的很小,即便是像鴻祥那樣的招牌大牛,文章是那麼的乾貨,瀏覽量有多少?不到萬吧;有人說,你別妄想在寫作上面知識變現了,因為你寫的文章真的很不優秀,我都不

正確的初始Java 程式設計中至關重要!

有人說,你應該關注時事、財經,甚至流行的電影、電視劇,才有可能趁著熱點寫出爆文;有人說,你別再寫“無聊”的技術文了,因為程式設計師的圈子真的很小,即便是像圈中鴻祥那樣的招牌大牛,文章是那麼的乾貨,瀏覽量有多少?不到萬吧;有人說,你別妄想在寫作上面知識變現了,因為你寫的文章真的很不優秀,

利用java的反射實現工廠創建對象

傳遞 之前 illegal stack bject 運行時 做的 ace exc public static Object getInstance(Class c){ Object obj = null; try {

Docker 實戰案例解析實現自己主動資料庫遷移

出品丨Docker公司(ID:docker-cn) 編譯丨小東 每週一、三、五晚6點10分  與您不見不散 說在前面 在 Phorest Salon Software 公司,我們是在 AWS 上執行我

SpringBoot利用java反射機制實現靈活讀取Excel表格中的資料和匯出資料至Excel表格

如果直接把固定Excel表格模板中的資料匯入資料庫,直接將Excel中的資料讀取出來,再存入資料庫中即可,將資料匯出至固定的Excel模板方法類似。但是,有時候,開發製作的模板與客戶需要的往往有些許差別(欄位排版、欄位數量等)。為了實現匯入匯出的靈活性,將利用java的反射機

java常見練習實現陣列快速排序功能

題目:用java實現陣列快速排序功能 首先要實現快速排序的話需要先得到數組裡的每一個數字,先遍歷這個陣列,即: 第一步 int[] arr = {2,1,5,4,7,9}; for (int i = 0; i < arr.length; i++) { {

springboot採用Docker容器實現可執行jar檔案編譯成映象以及映象的釋出

作者:ydw_武漢聯絡方式:[email protected]前言:Docker是一個linux的容器管理工具,在現在的架構中,使用非常普遍,它允許使用者把容器映象推送到一個公共的庫或者是私有的映象庫中,使用也方便,對於之前專案的部署為了部署環境的統一也很麻煩,現在

java 服務端實現服務端與客戶端之間的通訊以及客戶端之間的通訊

此服務端是利用socket進行通訊 ServerSocket serversocket = new ServerSocket(12333); 使用本機的12333埠進行通訊,可以自己選擇 一般選擇10000以後的埠不會與其他服務衝突 import j

java】KDTree實現java版本留著日後可能用得上

Java版本KDTree 在KDTree中,只有n >> 2 ^ xn時,在明顯得有KDTCount << n, n是點的個數, xn是點的維數 KDTCount是在KDTree搜尋時計算距離的次數統計 package main; import

java遞迴實現求全排列

有1~n的n個整數,現要求打印出這n個數的所有可能的排列。比如 1 、2、3的全排列:         1, 2, 3         1, 3, 2         2, 1, 3         2, 3, 1         3, 1, 2          3, 2

android framework新增自定義服務實現java層api呼叫

1.在frameworks/base/core/java/android/app/下新增aidl檔案 frameworks/base/core/java/android/app/IGMyTestService.aidl package android.app; // De

java jsp頁面實現微信一鍵關注

<%@ page contentType="text/html;charset=utf-8" language="java" %> <% //String gzh = request.getParameter("gzh"); Stri

使用JVM TI技術插裝位元組碼實現Java程式碼執行控監Agent

        JVM TI技術是JAVA5以後的版本推出的技術,即JVM程式設計介面,該技術廣泛應用於各種開發工具,例如Eclipse等。使用JVM TI可以開發JAVA除錯工具,JAVA程式碼執行監控工具等。同時,瞭解JVM TI技術也有助於JAVA程式設計師深入瞭解J

java-swing程式設計實現計算器——支援四則運算

==== 2018年4月19日 17:56:20 更新 ===專案地址在:https://github.com/qiao1406/java_calcultor/tree/dev這兩個星期學習了swing模組的一些內容,學習了java的GUI程式設計,自己動手寫了一個計算器首先

猜數字遊戲。編寫一個Java應用程式實現功能:

import javax.swing.JOptionPane;  public class GuessNumber  {            public static void main (String args[ ])       {            

利用Thrift實現java、php資料通訊

Thrift是一個軟體框架(遠端過程呼叫框架),用來進行可擴充套件且跨語言的服務的開發,封裝了資料傳輸格式(二進位制、json)和網路通訊的服務框架,提供多語言(C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScrip

利用java反射機制實現對類的私有變數和私有方法的訪問

記得有一句很有名的話:No reflection ,no frameworks 這一句短短的話道出了java 反射機制的強大。 java關於反射機制的包主要在java.lang.reflect中,structs,hibernate,spring等框架都是基於java的反射機制。 下面是一個關於利用j

java建立陣列實現增刪改查

1:建立陣列 int[] arr = new int[10];//建立陣列,初始化大小為10 2:訪問資料資料項     arr[0]=1;//這個是設定她的值             System.out.println(arr[0]);//這個是獲取她的值,通過列印的方