1. 程式人生 > >transient關鍵字及Serializable的序列化與反序列化

transient關鍵字及Serializable的序列化與反序列化

java中的Serializable提供一種持久化機制,將實現了Serializable介面的物件序列化為位元組序列,並在以後可以將此位元組序列恢復為java物件。
序列化實現了資料的持久化,儲存在硬碟中,並且在網路上進行位元組序列的傳送。
    transient:在序列化時,若欄位定義為transient,則會自動對該欄位不進行序列化。不讓序列化機制進行自動儲存與恢復,則加上transient
舉例說明:
package day01; 

import java.io.Serializable;
import java.util.Date;

/** 
 * @author wangpei 
 * @version
*建立時間:2017年1月17日 下午7:39:15 * 練習序列化 */
public class xuliehua implements Serializable { private Date nowtime=new Date(); private String uid; private transient String pswd; xuliehua(String uid,String pswd ){ this.uid=uid; this.pswd=pswd; } public String toString
(){ String password=null; if(pswd==null) password="沒有值"; else password=pswd; return "nowtime="+nowtime+"uid="+uid+"pswd="+password; }
package day01; 

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import
java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; /** * @author wangpei * @version *建立時間:2017年1月17日 下午7:48:12 * */ public class test { public static void main(String[] args) { xuliehua m=new xuliehua("xiaozhang","123" ); ObjectOutputStream o; //序列化 try { o = new ObjectOutputStream( new FileOutputStream("logInfo.out")); o.writeObject(m); o.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } //反序列化 try { ObjectInputStream in =new ObjectInputStream( new FileInputStream("logInfo.out")); xuliehua logInfo = (xuliehua)in.readObject(); System.out.println(logInfo.toString()); } catch(Exception e) {//deal with exception} } } }

執行後:
nowtime=Tue Jan 17 20:21:17 CST 2017uid=xiaozhangpswd=沒有值


注意:在對位元組序列進行反序列化的過程中,沒有呼叫任何的構造器,包括預設的構造器,整個物件都是通過從InputStream 中去得資料而進行恢復的。舉例:

package day01;

import java.io.Serializable;
import java.util.Date;

/**
* @author wangpei
* @version
*建立時間:2017年1月17日 下午7:39:15
* 練習序列化
*/
public class xuliehua implements Serializable {
private Date nowtime=new Date();
private String uid;
private transient String pswd;
xuliehua( ){
this.uid=”xiaozhang”;
this.pswd=”123”;

}
public String toString(){
    String password=null;
    if(pswd==null)
        password="沒有值";
    else
        password=pswd;
    return "nowtime="+nowtime+"uid="+uid+"pswd="+password;

}

}

package day01;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

/**
* @author wangpei
* @version
*建立時間:2017年1月17日 下午7:48:12
*
*/
public class test {

public static void main(String[] args) {
    xuliehua m=new xuliehua();
    ObjectOutputStream o;
    try {
        o = new ObjectOutputStream(   
                new FileOutputStream("logInfo.out"));
        o.writeObject(m);   
        o.close(); 
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }   
    try  
    {   
       ObjectInputStream in =new ObjectInputStream(   
                    new FileInputStream("logInfo.out"));   
       xuliehua logInfo = (xuliehua)in.readObject();   
       System.out.println(logInfo.toString());   
    }   
    catch(Exception e) {//deal with exception}   
}
}

}

結果:

nowtime=Tue Jan 17 20:29:27 CST 2017uid=xiaozhangpswd=沒有值

分析pswd仍然是空值,即使在構造方法中已經對其進行了初始化,但是在恢復的過程中只是呼叫了序列化後的InputStream中的值,而序列化後的pswd為空值,反序列化也為空。
    要序列化一個物件,首先,建立某些OutputStream(例如:FileOutputStream)物件,然後將其封裝在ObjectOutputStream物件中,然後呼叫,writeObject方法,並將其傳送給OutputStream,即可進行序列化,反序列化基本相同只不過是讀出。
    程式碼:

try {
o = new ObjectOutputStream(
new FileOutputStream(“logInfo.out”));
o.writeObject(m);
o.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
“`

相關推薦

transient關鍵字Serializable序列序列

java中的Serializable提供一種持久化機制,將實現了Serializable介面的物件序列化為位元組序列,並在以後可以將此位元組序列恢復為java物件。 序列化實現了資料的持久化,儲存在硬碟中,並且在網路上進行位元組序列的傳送。 transi

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

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

樹的序列序列應用

我們知道,先序和中序或者後序與中序都可以唯一確定一棵樹,但是先序和後序不行。 今有兩個需求:判斷兩棵樹是否元素相等或是否元素對稱。 方法1:先序和中序或者中序和後序可以唯一確定一棵樹,那麼我們把他們遍歷生成的特徵序列對比即可判斷。 判相等:用遞迴函式,引數是兩棵樹的跟節點,兩個節點採取任

java序列序列transient和static成員剖析

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

Serializable序列序列編碼例項

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

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

契約類相關的序列序列

pub ima cti 相關 ria 數據 num spa set 契約類指繼承了:DataContract的類。契約類常在WCF,webService等各種服務中作為傳輸數據使用。 凡是契約類或者繼承了契約類的類,如果想要屬性參與序列化與反序列化,需要在屬性上加上標記:D

Java序列序列

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

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

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

C#對象序列序列

space ros 個人信息 瀏覽器 特性 點名 文件名 屬性節點 派生 1.對象序列化的介紹 (1).NET支持對象序列化的幾種方式 二進制序列化:對象序列化之後是二進制形式的,通過BinaryFormatter類來實現的,這個類位於System.Runtime.Seri

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

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

畢業項目畢業 -- pickle序列序列操作

style import 使用 python pan 項目 imp 序列化 操作 Python可以使用pickle做序列化: 序列化示例: import picklewith open(‘les.pickle‘, ‘wb‘) as f: pickle.du

C#語言-08.序列序列

clas 本質 cnblogs 語法 信息 字段 使用 serializa col a. 序列化:是將對象的狀態存儲到特定存儲介質中的過程 i. 語法:public void Serialize(序列化過程的文件流,保存的對象)

Day4 閉包、裝飾器decorator、叠代器生成器、面向過程編程、三元表達式、列表解析生成器表達式、序列序列

反序 bsp pic nbsp tor 序列 space 列表解析 列表 http://pic.cnhubei.com/space.php?uid=1774&do=album&id=1362489http://pic.cnhubei.com/space.ph

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

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

如何使用 JSON for Modern C++ 序列序列號,換行符導致序列失敗

http gb2 elf ldp c++ spi ssp 使用 b16 W48z士5742i4鍁鉀http://shequ.docin.com/qbvl66336 6j夠裝何掖tj嘔蔡5VLhttp://tushu.docin.com/olybb166 渤k搶97L巳綱鋅7

單例模式序列序列

int nts 如果 mex res tac tor cep ios package com.wz.thread.resolve;import java.io.ObjectStreamException;import java.io.Serializable;/** * 序

python-序列序列

ret bject 通用 for pla nco ray 字典 read 序列化模塊# 序列化方法# 格式轉換# 把python中的數據轉換成str---序列化# 可以str轉換成python的數據---反序列化 json模塊 # json所有的語言都通用,它能序列化的數

模塊講解----json模塊(跨平臺的序列序列

/usr 列表 strong 序列化 類型轉換 min 字符 虛擬 json 一、json的特點 1、只能處理簡單的可序列化的對象;(字典,列表,元祖) 2、json支持不同語言之間的數據交互;(python - go,python - java) 二、使用場