Как работают writeObject и readObject?

Когда я прочитал исходный код JDK 6.0, я нашел эти два метода в ArrayList. Вы видите, что они оба частные. Но после поиска я не нашел других методов, вызывающих ни один из них. Я также рассмотрел нативные методы, но так и не смог найти ни одного. Эти два метода, кажется, имеют дело с IO, но они никогда не вызываются.

Итак, мой вопрос, как они работают? Есть ли другой способ вызвать закрытые методы?

/**
 * Save the state of the <tt>ArrayList</tt> instance to a stream (that is, serialize it).
 */
private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException;

/**
 * Reconstitute the <tt>ArrayList</tt> instance from a stream (that is, deserialize it).
 */
private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException;

1 ответ

Решение

Эти два метода используются в сериализуемом классе для настройки сериализации (иначе говоря, "Настройка протокола по умолчанию").

Текст из статьи:

Есть, однако, странное, но хитрое решение. Используя встроенную функцию механизма сериализации, разработчики могут улучшить обычный процесс, предоставив два метода внутри своих файлов классов. Эти методы:

  1. private void writeObject (ObjectOutputStream out) выбрасывает IOException;
  2. private void readObject (ObjectInputStream in) выбрасывает IOException, ClassNotFoundException;

Обратите внимание, что оба метода объявлены (и должны быть) закрытыми, что доказывает, что ни один из методов не наследуется, не переопределяется и не перегружается. Хитрость заключается в том, что виртуальная машина автоматически проверяет, объявлен ли какой-либо метод во время соответствующего вызова метода. Виртуальная машина может вызывать закрытые методы вашего класса в любое время, но никакие другие объекты не могут.

Другие вопросы по тегам