簡體   English   中英

Java臨時字段的序列化

[英]Java serialization of transient fields

我正在閱讀《 Java 4版中的思考》 其中描述了一個用於transient字段序列化的奇怪解決方法:

import java.io.*;

public class SerializationTest implements Serializable {
    private String firstData;
    //transient field, shouldn't be serialized.
    transient private String secondData;

    public SerializationTest(String firstData, String test2) {
        this.firstData = firstData;
        this.secondData = test2;
    }

    /**
     * Private method, same signature as in Serializable interface
     *
     * @param stream
     * @throws IOException
     */
    private void writeObject(ObjectOutputStream stream) throws IOException {
        stream.defaultWriteObject();
        stream.writeObject(secondData);
    }

    /**
     * Private method, same signature as in Serializable interface
     *
     * @param stream
     * @throws IOException
     */
    private void readObject(ObjectInputStream stream)
            throws IOException, ClassNotFoundException {
        stream.defaultReadObject();
        secondData = (String) stream.readObject();

    }

    @Override
    public String toString() {
        return "SerializationTest{" +
                "firstData='" + firstData + '\'' +
                ", secondData='" + secondData + '\'' +
                '}';
    }

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        FileOutputStream fos = null;
        ObjectOutputStream oos = null;
        try {
            fos = new FileOutputStream("object.out");
            oos = new ObjectOutputStream(fos);
            SerializationTest sTest = new SerializationTest("First Data", "Second data");
            oos.writeObject(sTest);
        } finally {
            oos.close();
            fos.close();
        }
        FileInputStream fis = null;
        ObjectInputStream ois = null;
        try {
            fis = new FileInputStream("object.out");
            ois = new ObjectInputStream(fis);
            SerializationTest sTest = (SerializationTest) ois.readObject();
            System.out.println(sTest);
        } finally {
            ois.close();
            fis.close();
        }
        //Output:
        //SerializationTest{firstData='First Data', secondData='Second data'}
    }
}

如您所見,實現了私有方法writeObjectreadObject

問題是:

哪些ObjectOutputStream和ObjectInputStream使用Reflection訪問私有方法?

Java中包含多少個類似的后門?

后門? 它一直在規格中。 這是實現對象的非默認序列化的唯一方法。

非默認序列化使您處於序列化驅動程序的位置。 您可以將任何內容寫入輸出流,只要可以將其讀回並在流的另一端構造對象,就可以了。

這個人決定序列化瞬態字段的事實並不是問題,關鍵是,如果您要實現自己的序列化方案,則可以執行任何操作。

嗯,這不是“后門”……您實現了自定義序列化,該序列化會在調用默認序列化並將其忽略后將瞬態字段輸出到輸出流。

Serializable接口是標記接口。 因此,它就像一個標簽來解釋Java編譯器。 還有其他標記界面,例如Clonable等。有關更多信息,請參見此處 但是,現在使用@annotations的天數更多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM