如何仅序列化Java类中的极少数属性

时间:2015-06-20 12:14:14

标签: java serialization

最近在一次采访中我被问到一个问题:

  

Java类中有100个属性,我应该只能序列化2个属性。这怎么可能?

标记所有98个属性不是答案,因为它效率不高。 我的答案是将这些属性划分为一个单独的类并使其可序列化。

但我被告知,我不会被允许修改班级的结构。 好吧,我试图在网上论坛找到答案,但是徒劳无功。

3 个答案:

答案 0 :(得分:12)

如果它只是几个字段,那么您始终可以将它们标记为transient。但是如果你的搜查需要更多的控制逻辑,那么Externalizable就是答案。您可以通过实现writeExternal接口的方法readExternalExternalizable方法来覆盖序列化和去除化过程。

以下是显示如何仅序列化少数字段的小代码

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