我有一个实现Serializable
的类。当我序列化该类的成员时,有些变量/方法我不希望包含在序列化表示中。
考虑Name
的{{1}}类:
Serializable
假设我希望每个实例的序列化形式排除class Name implements Serializable {
private String firstName;
private String middleName;
private String lastName;
...
}
属性。
有什么办法可以排除特定的属性和方法被包含在对象的序列化表示中吗?
答案 0 :(得分:8)
有什么方法可以达到这个目的吗?
是有一种方法。你正在寻找瞬态。喜欢这个
private transient x;
要添加它,您创建的所有对象变量都将转换为持久状态。因此,当您将这些变量声明为瞬态时,它将不会被持久化。这是transient关键字的主要目的。
来自Java docs:
变量可能会标记为瞬态,表示它们不属于某一部分 对象的持久状态。
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)
在数据成员之前声明瞬态或静态,以排除该特定数据成员的序列化