天天看點

Java transient關鍵字使用小結

1、transient關鍵字隻能修飾變量,而不能修飾方法和類。注意,本地變量是不能被transient關鍵字修飾的。

2、被transient關鍵字修飾的變量不再能被序列化,一個靜态變量不管是否被transient修飾,均不能被序列化。

3、一旦變量被transient修飾,變量将不再是對象持久化的一部分,該變量内容在序列化後無法獲得通路。也可以認為在将持久化的對象反序列化後,被transient修飾的變量将按照普通類成員變量一樣被初始化。

<a></a>

如下面的例子

package com.kkoolerter;

import java.io.file;

import java.io.fileinputstream;

import java.io.fileoutputstream;

import java.io.objectinputstream;

import java.io.objectoutputstream;

import java.io.serializable;

import java.util.date;

public class main implements serializable {

    private static final long serialversionuid = -5836283489677344417l;

    private transient int classvalue = 10;

    private transient date date = new date();

    private transient static int staticvalue = 10;

    public static void main(string[] args) throws exception {

        main m = new main();

        m.classvalue = 11;

        main.staticvalue = 11;

        objectoutputstream out = new objectoutputstream(new fileoutputstream(

                new file(“0xjh000”)));

        out.writeobject(m);

        out.close();

        objectinputstream in = new objectinputstream(new fileinputstream(

        main m1 = (main) in.readobject();

        in.close();

        system.out.println(m1.classvalue);

        system.out.println((m1.date == null ? “date is null”

                : “date is not null”));

    }

}

程式将輸出:

date is null

這就說明了一旦變量被transient修飾,變量将不再是對象持久化的一部分,該變量内容在序列化後無法獲得通路。

思考一下下面的例子:

import java.io.externalizable;

import java.io.ioexception;

import java.io.objectinput;

import java.io.objectoutput;

public class externalizabletest implements externalizable {

    private transient string content = “哈哈~我将會被序列化,不管我是是否被transient關鍵字修飾”;

    @override

    public void writeexternal(objectoutput out) throws ioexception {

        out.writeobject(content);

    public void readexternal(objectinput in) throws ioexception,

            classnotfoundexception {

        content = (string) in.readobject();

        externalizabletest et = new externalizabletest();

        objectoutput out = new objectoutputstream(new fileoutputstream(

                new file(“ext0000”)));

        out.writeobject(et);

        objectinput in = new objectinputstream(new fileinputstream(new file(

                “ext0000”)));

        externalizabletest et1 = (externalizabletest) in.readobject();

        system.out.println(et1.content);

程式運作後将輸出如下結果:

哈哈~我将會被序列化,不管我是是否被transient關鍵字修飾

這是為什麼呢,不是說類的變量被transient關鍵字修飾以後将不能序列化了嗎?

們知道在java中,對象的序列化可以通過實作兩種接口來實作,若操作的是一個serializable對象,則所有的序列化将會自動進行,若操作的是

一個externalizable對象,則沒有任何東西可以自動序列化,需要在writeexternal方法中進行手工指定所要序列化的變量,這與是否

被transient修飾無關。是以第二個例子輸出的是變量content初始化的内容,而不是null。

本文出自 “有思想的代碼” 部落格,請務必保留此出處http://wujuxiang.blog.51cto.com/2250829/430211