最近在一次采访中我被问到一个问题:
Java类中有100个属性,我应该只能序列化2个属性。这怎么可能?
标记所有98个属性不是答案,因为它效率不高。 我的答案是将这些属性划分为一个单独的类并使其可序列化。
但我被告知,我不会被允许修改班级的结构。 好吧,我试图在网上论坛找到答案,但是徒劳无功。
答案 0 :(得分:12)
如果它只是几个字段,那么您始终可以将它们标记为transient
。但是如果你的搜查需要更多的控制逻辑,那么Externalizable
就是答案。您可以通过实现writeExternal
接口的方法readExternal
和Externalizable
方法来覆盖序列化和去除化过程。
以下是显示如何仅序列化少数字段的小代码
public class Person implements Externalizable {
String name;
int age;
public Person() { }
Person(String name, int age) {
this.name = name;
this.age = age;
}
public void writeExternal(ObjectOutput out) throws IOException {
out.writeObject(name);
//out.writeInt(age); // don't write age
}
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
name = (String) in.readObject(); // read only name and not age
}
}
答案 1 :(得分:8)
答案是java的 transient 关键字。 如果你创建一个类的瞬态属性,它将不会被序列化或反序列化。 例如:
private transient String nonSerializeName;
答案 2 :(得分:2)
您可以使用Externalizable接口
覆盖序列化行为不带你需要添加以下方法并在那里做必要的事,
private void writeObject(ObjectOutputStream out) throws IOException;
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException;
例如,类看起来像这样,
class Foo{
private int property1;
private int property2;
....
private int property100;
private void writeObject(ObjectOutputStream out) throws IOException
{
out.writeInt(property67);
out.writeInt(property76);
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException
{
property67 = in.readInt();
property76 = in.readInt();
}
}
有关详细信息,请参阅this