Как сериализовать только очень мало свойств в классе Java
Недавно в интервью мне задали вопрос:
В Java-классе есть 100 свойств, и я должен иметь возможность сериализовать только 2 свойства. Как это возможно?
Отметка всех 98 свойств не была ответом, поскольку она неэффективна.
Мой ответ заключался в том, чтобы вырезать эти свойства в отдельный класс и сделать его сериализуемым.
Но мне сказали, что мне не разрешат изменять структуру класса.
Ну, я попытался найти ответ в онлайн-форумах, но тщетно.
Ответы
Ответ 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;