Чтобы добавить к другим ответам, реализовав java.io.Serializable
, вы получаете возможность «автоматической» сериализации для объектов вашего класса. Нет необходимости реализовывать какую-либо другую логику, она будет работать. Java-среда выполнения использует рефлексию для определения того, как маршалировать и де-маршалировать ваши объекты.
В более ранней версии Java отражение было очень медленным, и поэтому сериализация крупных графиков объектов (например, в клиент-серверных приложениях RMI) было немного проблем с производительностью. Чтобы справиться с этой ситуацией, был предоставлен интерфейс java.io.Externalizable
, который похож на java.io.Serializable
, но с настраиваемыми механизмами для выполнения функций маршаллинга и развязывания (вам нужно реализовать методы readExternal
и writeExternal
в вашем классе). Это дает вам возможность обойти узкое место производительности отражения.
В последних версиях Java (начиная с версии 1.3, конечно) производительность отражения намного лучше, чем раньше, и поэтому это гораздо менее проблематично. Я подозреваю, что вам будет трудно получить значимую выгоду от Externalizable
с современной JVM.
Кроме того, встроенный механизм сериализации Java не является единственным, вы можете получить сторонние замены, такие как JBoss Serialization, что значительно быстрее и является заменой для замены default.
Большой недостаток Externalizable
заключается в том, что вы должны сами поддерживать эту логику - если вы добавляете, удаляете или изменяете поле в своем классе, вы должны изменить свой writeExternal
/ readExternal
методы для его учета.
Таким образом, Externalizable
является реликвией Java 1.1 дней. В этом нет необходимости.
Подобная случайная выборка возвращает список уникальных элементов последовательности. Не путайте это со случайными целыми числами в диапазоне.
>>> import random
>>> random.sample(range(30), 4)
[3, 1, 21, 19]
Подойдет комбинация random.randrange и понимание списка.
import random
[random.randrange(1, 10) for _ in range(0, 4)]