Подтвердить что ты не робот

Как сериализовать только очень мало свойств в классе Java

Недавно в интервью мне задали вопрос:

В Java-классе есть 100 свойств, и я должен иметь возможность сериализовать только 2 свойства. Как это возможно?

Отметка всех 98 свойств не была ответом, поскольку она неэффективна. Мой ответ заключался в том, чтобы вырезать эти свойства в отдельный класс и сделать его сериализуемым.

Но мне сказали, что мне не разрешат изменять структуру класса. Ну, я попытался найти ответ в онлайн-форумах, но тщетно.

4b9b3361

Ответ 1

Вы можете переопределить поведение сериализации без, используя интерфейс 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();
  }
}

Подробнее см.

Ответ 2

Если это несколько полей, вы всегда можете отметить их как 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
    }
}

Ответ 3

Ответом является переходное ключевое слово java. если вы создадите свойство переходного процесса класса, он не будет сериализован или десериализован. Например:

private transient String nonSerializeName;