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

时间:2014-09-11 12:13:45

标签: java serialization

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

考虑Name的{​​{1}}类:

Serializable

假设我希望每个实例的序列化形式排除class Name implements Serializable { private String firstName; private String middleName; private String lastName; ... } 属性。

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

5 个答案:

答案 0 :(得分:8)

  

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

有一种方法。你正在寻找瞬态。喜欢这个

private transient x;

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

来自Java docs

  

变量可能会标记为瞬态,表示它们不属于某一部分   对象的持久状态。

Example from source

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);
    }
}

//输出将是:

First Name : Steve
Middle Name : null
Last Name : Jobs

答案 1 :(得分:1)

将它们定义为瞬态。

private String serializedField; // gets serialized
private transient String field; // doesn't get serialized

答案 2 :(得分:0)

在您不想序列化的变量之前使用

transient关键字

例如

private transient yourvariable;

并且瞬态不能与仅用于变量的方法一起使用

答案 3 :(得分:0)

要排除成员序列化,请将其定义为transient

E.g。

public class A extends Serializable {
    private int a;
    private transient int b;
}

b不会在此课程中序列化。

答案 4 :(得分:0)

在数据成员之前声明瞬态或静态,以排除该特定数据成员的序列化