Я читал статью в Википедии о DD и перешел к "Двойная диспетчеризация в Java и пример" ссылка в конце. Описание следующего примера Serializable кажется мне довольно запутанным:
A a = new A();
ObjectOutputStream oos = new ObjectOutputStream();
oos.writeObject( a);
Вот описание:
Чтобы сериализовать A,
ObjectOutputStream
сначала проверяет, существует ли методwriteObject( ObjectOutputStream oos)
. Если это так, то он вызывает этот метод с самим собой в качестве аргумента. Затем методwriteObject
отправляет вызов обратно вObjectOutputStream
(что делает его двойной отправкой). Выполняя этот очень простой обратный вызов,ObjectOutputStream
сказал: "Я делегирую вам ответственность за запись вашего состояния в этот поток". Сделав этот простой выбор,ObjectOutputStream
отделился от нашего объектаA
. ОбъектA
в свою очередь говорит ок, вот какое-то состояние, которое я хочу записать в поток. Если значение является примитивом, то с ним можно справиться путем перегрузки метода записи. Если нет, то можно продолжать движение вперед и назад на следующем уровне графа объектов до тех пор, пока все полезное состояние не будет размещено в потоке.
Я предполагаю, что описание может сбивать с толку, потому что описывается то, что происходит за кулисами, а не представленный код, потому что в противном случае это не имеет особого смысла. Вот части, которые меня смущают:
- «
ObjectOutputStream
сначала проверяет, существует ли методwriteObject( ObjectOutputStream oos)
». ЗачемObjectOutputStream
проверять наличие этого метода, если это его собственный метод? - «Если это так, то он вызывает этот метод с самим собой в качестве аргумента». Мне кажется, что он вызывает
writeObject
с экземпляромA
в качестве аргумента. Возвращаясь к предыдущему пункту, зачем ему искать подписьwriteObject
с аргументомObjectOutputStream
, если он вызывается с экземпляромA
? - «Затем метод
writeObject
отправляет вызов обратно вObjectOutputStream
(что делает его двойной отправкой)». Опять же, методwriteObject
принадлежит классуObjectOutputStream
, поэтому я не вижу, как он «отправляется обратно вObjectOutputStream
», поскольку он кажется первоначальным пунктом назначения.
Я просто упустил что-то фундаментальное или это плохо написанный/описанный пример? Если это плохой пример, я хотел бы изменить статью в Википедии, чтобы указать на лучшую, поэтому не стесняйтесь вносить предложения.
Спасибо.