Использование readObject/writeObject в сериализации

Я просмотрел эту статью, чтобы больше узнать о процессе Java Serialization. Когда дело доходит до использования readObject/writeObject, я мог видеть два варианта использования:

  • Мы можем использовать writeObject для шифрования байтового кода до его сериализации. С точки зрения безопасности, это хорошо.
  • мы можем использовать readObject для выполнения любой конкретной части кода, которая должна выполняться сразу после десериализации, и, конечно же, из poin # 1, мы даже можем использовать readObject для дешифрования кода байта, который был зашифрован при сериализации объект.

Есть ли какой-либо другой практический сценарий, который вы встретили при сериализации/десериализации объектов, написав метод customR readObject/writeObject? Или Если вы могли бы указать мне в любое место, где я мог бы увидеть приличное и практичное использование readObject/writeObject?

Ответ 1

Пользовательские методы readObject также полезны, когда вам нужно инициализировать переходные (не сериализованные) поля после того, как объект был десериализован.


BTW, проверьте Эффективная Java, глава 11 (я не уверен, что номер главы/позиции во втором редакторе)., Это превосходное чтение о сериализации.

Ответ 2

Вы можете реализовать собственный объект readObject/writeObject по соображениям производительности или по соображениям обратной совместимости или потому, что поле, которое вы хотите сериализовать, не является Serializable.

Для хороших примеров readObject/writeObject я бы посмотрел в источнике, который поставляется с JDK. Или я бы попробовал http://www.google.co.uk/search?q=readObject+writeObject+examples

Ответ 3

При использовании пользовательской сериализации может быть несколько причин:

  • Производительность.
  • Взаимодействие с внешними системами. (Вне вашего охвата или даже просто не-Java-системы.)
  • Необходимый для человека формат.
  • Поддержка старых версий сериализованных классов.

Чтобы назвать только несколько, но я уверен, что их гораздо больше.

Ответ 4

Я дешифруюсь, что лучше сделать с помощью ObjectOutputStream на основе CipherOutputsStream.

Самое важное использование writeObject/readObject - это то, что вы хотите сохранить стабилизацию Serialization на нескольких версиях кода. Ваше внутреннее представление (переменные-члены) может измениться, но сериализация должна быть стабильной, поскольку есть старая система, с которой вы общаетесь (например, путем чтения старых данных из файлов).

Но я предпочитаю интерфейс Externalizable для этих случаев, поскольку он проще в использовании (не подразумеваемые вызовы и методы, о которых знает только jvm).

Ответ 5

public class Employee implements Serializable {

    private static final long serialVersionUID = 1L;

    private int empno;
    private String ename;
    private String job;

    // setter & getter

    @Override
    public String toString() {
        return "Employee [empno=" + empno + ", ename=" + ename + ", job=" + job
                + "]";
    }

    private void writeObject(ObjectOutputStream out) throws IOException {

        // default serialization
        // out.defaultWriteObject();

        // custom serialization
        out.writeInt(empno);
        out.writeUTF(ename);
        // out.writeUTF(job); //job will not serialize
    }

    private void readObject(ObjectInputStream in) throws IOException,
            ClassNotFoundException {

        // default deSerialization
        // in.defaultReadObject();

        // custom deSerialization
        empno = in.readInt();
        ename = in.readUTF();
        // this.job = in.readUTF();
    }

}