1. 程式人生 > >理解Java物件序列化——Serializable介面

理解Java物件序列化——Serializable介面

概述:當一個類實現了Serializable介面(該介面僅為標記介面,不包含任何方法定義),表示該類可以序列化.序列化的目的是將一個實現了Serializable介面的物件轉換成一個位元組序列,可以。 

把該位元組序列儲存起來(例如:儲存在一個檔案裡),以後可以隨時將該位元組序列恢復為原來的物件。甚至可以將該位元組序列放到其他計算機上或者通過網路傳輸到其他計算機上恢復,只要該計 

算機平臺存在相應的類就可以正常恢復為原來的物件。 

實現:要序列化一個物件,先要建立某些OutputStream物件,然後將其封裝在一個ObjectOutputStream物件內,再呼叫writeObject()方法即可序列化一個物件;反序列化也類似。 

import java.io.*; 

public class Person implements Serializable { 
private String userName; 
private String password; 

public Person(String userName, String password) { 
this.userName = userName; 
this.password = password; 


public String toString() { 
return "userName:" + userName + "  password:" + password; 



public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException { 
//序列化一個物件(儲存到一個檔案) 
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.out")); 
oos.writeObject("Save a object:\n"); 
oos.writeObject(new Person("Bruce", "123456")); 
oos.close(); 


//反序列化,將該物件恢復(儲存到一個檔案) 
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.out")); 
String s = (String)ois.readObject(); 
Person p = (Person)ois.readObject(); 
System.out.println(s + p); 

//序列化一個物件(儲存到位元組陣列) 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
ObjectOutputStream oos2 = new ObjectOutputStream(baos); 
oos2.writeObject("Save another object:\n"); 
oos2.writeObject(new Person("Phil", "654321")); 
oos2.close(); 

//反序列化,將該物件恢復(儲存到位元組陣列) 
ObjectInputStream ois2 = new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray())); 
s = (String)ois2.readObject(); 
p = (Person)ois2.readObject(); 
System.out.println(s + p); 


//輸入如下資訊 
Save a object: 
userName:Bruce  password:123456 
Save another object: 
userName:Phil  password:654321 

transient關鍵字: 
自動序列化將物件的所有欄位都持久化了,有時候需要對某些欄位不進行自動化(如密碼,因為序列化會暴光密碼資訊),這個時候可以使用transient關鍵字(只能和Serializable物件一起使 

用),其作用是不序列化某些欄位。將Person類的欄位改為如下定義,再執行上面的程式: 
private String userName; 
private transient String password; 
//輸入如下資訊 
Save a object: 
userName:Bruce  password:null 
Save another object: 
userName:Phil  password:null 

控制序列化欄位,甚至該欄位是被transient修飾的欄位也能將其序列化。手動序列化需要新增兩個私有(private)方法(writeObject()和readObject()),在該私有方法中控制序列花欄位。 
import java.io.*; 

public class Person implements Serializable { 
private String userName; 
private transient String password; 

public Person(String userName, String password) { 
this.userName = userName; 
this.password = password; 


public String toString() { 
return "userName:" + userName + "  password:" + password; 


private void writeObject(ObjectOutputStream out) throws IOException { 
out.defaultWriteObject();  //序列化所有非transient欄位,必須是該方法的第一個操作 
out.writeObject(password); //序列化transient欄位 


private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { 
in.defaultReadObject();             //反序列化所有非transient欄位,必須是該方法的第一個操作 
password = (String)in.readObject(); //反序列化transient欄位 


public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException { 
//序列化一個物件(儲存到一個檔案) 
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.out")); 
oos.writeObject("Save a object:\n"); 
oos.writeObject(new Person("Bruce", "123456")); 
oos.close(); 

//反序列化,將該物件恢復(儲存到一個檔案) 
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.out")); 
String s = (String)ois.readObject(); 
Person p = (Person)ois.readObject(); 
System.out.println(s + p); 


//輸入如下資訊 
Save a object: 
userName:David  password:13579 

控制序列化欄位還可以使用Externalizable介面替代Serializable藉口。此時需要定義一個預設構造器,否則將為得到一個異常(java.io.InvalidClassException: Person; Person; no 

valid constructor);還需要定義兩個方法(writeExternal()和readExternal())來控制要序列化的欄位。 
import java.io.*; 

public class Person implements Externalizable { 
private String userName; 
private String password; 

public Person() { 
System.out.println("default constructor invoked!"); 


public Person(String userName, String password) { 
this.userName = userName; 
this.password = password; 


public String toString() { 
return "userName:" + userName + "  password:" + password; 


public void writeExternal(ObjectOutput out) throws IOException { 
//序列化欄位 
out.writeObject(userName); 
out.writeObject(password); 


public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { 
//反序列化欄位 
userName = (String)in.readObject(); 
password = (String)in.readObject(); 


public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException { 
//序列化一個物件(儲存到一個檔案) 
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.out")); 
oos.writeObject("Save a object:\n"); 
oos.writeObject(new Person("Leo", "1984")); 
oos.close(); 

//反序列化,將該物件恢復(儲存到一個檔案) 
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.out")); 
String s = (String)ois.readObject(); 
Person p = (Person)ois.readObject(); 
System.out.println(s + p); 


//輸入如下資訊 
default constructor invoked! 
Save a object: 

相關推薦

理解Java物件序列——Serializable介面

概述:當一個類實現了Serializable介面(該介面僅為標記介面,不包含任何方法定義),表示該類可以序列化.序列化的目的是將一個實現了Serializable介面的物件轉換成一個位元組序列,可以。 把該位元組序列儲存起來(例如:儲存在一個檔案裡),以後可以隨時將該位元組序列恢復為原來的物件。甚至可以將該位

理解Java物件序列

1. 什麼是Java物件序列化     Java平臺允許我們在記憶體中建立可複用的Java物件,但一般情況下,只有當JVM處於執行時,這些物件才可能存在,即,這些物件的生命週期不會比JVM的生命週期更長。但在現實應用中,就可能要求在JVM停止執行之後能夠儲存(持久化)

深入理解Java物件序列

關於Java序列化的文章早已是汗牛充棟了,本文是對我個人過往學習,理解及應用Java序列化的一個總結。此文內容涉及Java序列化的基本原理,以及多種方法對序列化形式進行定製。在撰寫本文時,既參考了Thinking in Java, Effective Java,JavaWorld,developerWor

java理解Java物件序列

原文地址:http://www.blogjava.net/jiangshachina/archive/2012/02/13/369898.html 關於Java序列化的文章早已是汗牛充棟了,本文是對我個人過往學習,理解及應用Java序列化的一個總結。此文內容涉及Java序列

java 物件實現序列 Serializable()介面

總結一下Serializable介面的實現原理。 當一個類實現了Seializable介面(該介面僅為標記介面,不包含任何方法定義),表示該類可以序列化,序列化的目的是將一個實現了Serializable介面的物件可以轉換成一個位元組序列,儲存物件的狀態。 把該位元組序列

Java 物件序列和反序列 (實現 Serializable 介面

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

Java物件序列原理以及Serializable介面

Java物件的序列化就是把一個物件變成二進位制的資料流的一中方法,通過物件的序列化可以方便的實現物件的傳輸和儲存。 原理是:物件------------->轉換----------------->將物件轉變為二進位制的資料             在物件序列化時

java物件序列理解

JAVA RMI(Remote Method Invocation)遠端方法呼叫 在RMI 中物件和簡單的資料值可以作為方法呼叫的引數和結果傳遞。一個物件就是java類的例項。 java序列化: 將一個物件或一組有關的物件做成適合於磁碟儲存或訊息傳

java物件序列機制

1.定義 java物件序列化機制允許實現了Serializable/Externalizable介面的java物件永久性地儲存到計算機的磁碟中,或則允許java物件直接在網路中傳輸,擺脫平臺的限制。反序列化即使將IO流中的位元組序列轉化為java物件。 2.原理 3.使用 序列化: 1)一個實現了S

java - 物件序列

在java中可以將物件進行序列化操作 要使物件能夠被序列化,那麼被序列化的物件要實現介面Serializable,此介面位於java.io包中 pakacge demo; import java.io.Serializable; /** * 實現了Serializable 介面的

java物件序列與複製圖片

下面程式碼包括賦值多個圖片,物件的序列化,目的是將物件狀態存入檔案,再把物件狀態從檔案中讀取。 DataInputStream dis; DataOutputStream dos; FileInputStream fi = null;

記一次使用Jackson對Java物件序列和反序列的踩坑經歷

背景大概是這樣,專案中的兩個服務A和B依賴了同一個common包的Java類,A對該類json序列化,而B對其反序列化。在一次common包升級過程中,這個Java類中增加了一個屬性,由於B其實用不到這個屬性,就只把A給升級打包了,這就導致B在反序列化時出現了一個異常:com.fasterxml.j

關於 Java 物件序列您不知道的 5 件事

關於本系列 您覺得自己懂 Java 程式設計?事實上,大多數程式設計師對於 Java 平臺都是淺嘗則止,只學習了足以完成手頭上任務的知識而已。在本 系列 中,Ted Neward 深入挖掘 Java 平臺的核心功能,揭示一些鮮為人知的事實,幫助您解決最棘手的程式設計挑戰。 大約一年前,一個負責管理應用程式

Java物件序列

什麼是物件序列化? 物件序列化是指將物件轉換為二進位制資料流的操作,從而使物件的狀態資訊轉換為可以儲存或傳輸的形式。通俗點,我覺得就是把物件的狀態轉換為一個字串(這個字串是亂碼的,誰也看不懂)。 為什麼要有物件序列化? 比如有一個建立一個物件: Book book=n

Java 物件序列方法

舉個例子直接說明,下面是一個學生物件 import java.io.Serializable; import lombok.Data; import com.baomidou.mybatisplus.enums.IdType; import java.math.BigDecimal; i

Java 物件序列與反序 (json格式)

將 物件序列化與反序化 (json格式) 實體類 package com.nf.redisDemo1.entity; public class News { private long id; private String title; private S

Java深度歷險(十)——Java物件序列與RMI

對於一個存在於Java虛擬機器中的物件來說,其內部的狀態只保持在記憶體中。JVM停止之後,這些狀態就丟失了。在很多情況下,物件的內部狀態是需要被持久化下來的。提到持久化,最直接的做法是儲存到檔案系統或是資料庫之中。這種做法一般涉及到自定義儲存格式以及繁瑣的資料轉換。物件關

java物件序列並存儲到檔案和資料庫

Java中要實現將物件儲存起來持久化,需要讓物件實現Serializable介面,這樣就能將java物件用二進位制流儲存並恢復。下面我將以儲存到檔案和儲存到mysql來進行解析。先給出序列化類的定義:package model; import java.io.Seriali

java物件序列、gzip壓縮解壓縮、加密解密

有時在應用中需要將java物件序列化儲存起來,有的需要壓縮,有的需要加密 EncryptUtil.java Java程式碼   package org.test.demo;   import java.io.UnsupportedE

Java 物件序列機制詳解

物件序列化的目標:將物件儲存到磁碟中,或允許在網路中直接傳輸物件。 物件序列化機制允許把記憶體中的Java物件轉換成平臺無關的二進位制流,從而允許把這種二進位制流持久的儲存在磁碟上,通過網路將這種二進位制流傳輸到另一個網路節點。其他程式一旦獲得了這種二進位制流,都可以講這種