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

2022-09-04 07:32:44

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

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

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

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


答案 1

如果它是关于几个字段的,那么你总是可以将它们标记为.但是,如果你在你的searilization中需要更多的受控逻辑,那么Exetrolizable就是答案。您可以通过实现接口的方法和方法重写序列化和反序列化过程。transientwriteExternalreadExternalExternalizable

下面是一个小代码,用于演示如何仅序列化几个字段

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

答案 2

答案是java的瞬态关键字。如果使类的属性暂时变,则不会对其进行序列化或反序列化。例如:

private transient String nonSerializeName;