序列化对象时,如何防止特定成员的序列化?

Moh*_*hit 4 java serialization

我有一个实现的类Serializable.当我序列化该类的成员时,有些变量/方法我不希望包含在序列化表示中.

考虑一个NameSerializable:

class Name implements Serializable {
    private String firstName;
    private String middleName;
    private String lastName;

    ...
}
Run Code Online (Sandbox Code Playgroud)

假设我希望每个实例的序列化形式排除middleName属性.

有没有什么办法可以排除特定的属性和方法被包含在对象的序列化表示中?

Rah*_*thi 8

有什么方法可以达到这个目的吗?

是的,有一种方法.你正在寻找瞬态.像这样

private transient x;
Run Code Online (Sandbox Code Playgroud)

要添加它,您创建的所有对象变量都将转换为持久状态.因此,当您将这些变量声明为瞬态时,它将不会被持久化.这是transient关键字的主要目的.

来自Java文档:

变量可以标记为瞬态,以指示它们不是对象的持久状态的一部分.

来源示例:

package javabeat.samples;

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

class NameStore implements Serializable{
    private String firstName;
    private transient String middleName;
    private String lastName;
    public NameStore (String fName,
                         String mName,
                         String lName){
        this.firstName = fName;
        this.middleName = mName;
        this.lastName = lName;
    }
    public String toString(){
        StringBuffer sb = new StringBuffer(40);
        sb.append("First Name : ");
        sb.append(this.firstName);
        sb.append("Middle Name : ");
        sb.append(this.middleName);
        sb.append("Last Name : ");
        sb.append(this.lastName);
        return sb.toString();
    }
}
public class TransientExample{
    public static void main(String args[]) throws Exception {
        NameStore nameStore = new NameStore("Steve",
                                     "Middle","Jobs");
        ObjectOutputStream o = new ObjectOutputStream
                   (new FileOutputStream("nameStore"));
        // writing to object
        o.writeObject(nameStore);
        o.close();

        // reading from object
        ObjectInputStream in =new ObjectInputStream(
                new FileInputStream("nameStore"));
        NameStore nameStore1 = (NameStore)in.readObject();
        System.out.println(nameStore1);
    }
}
Run Code Online (Sandbox Code Playgroud)

//输出将是:

First Name : Steve
Middle Name : null
Last Name : Jobs
Run Code Online (Sandbox Code Playgroud)