Когда мы должны реализовать Serializable интерфейс?

153
public class Contact implements Serializable {
    private String name;
    private String email;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}
  1. Когда я должен реализовать Serializableинтерфейс?
  2. Зачем мы это делаем?
  3. Это дает какие-то преимущества или безопасность?
theJava
источник
1
К вашему сведению, принятый здесь ответ является неполным и вводящим в заблуждение, поскольку он не устраняет недостатки безопасности. См. Эффективная Java , пункт 86: Реализовать Сериализуемый с большой осторожностью. Ответ Рэдвальда здесь, говоря, что не использовать сериализацию, является правильным.
Натан Хьюз

Ответы:

157
  1. От Что такое «сериализация» , что все это значит ? :

    Он позволяет вам взять объект или группу объектов, поместить их на диск или отправить их через проводной или беспроводной транспортный механизм, а затем, возможно, на другом компьютере, обратить процесс вспять: воскресить исходные объекты. Основные механизмы состоят в том, чтобы сгладить объект (ы) в одномерный поток битов и превратить этот поток битов обратно в исходный объект (ы).

    Как и в Transporter на Star Trek, все сводится к тому, чтобы взять что-то сложное и превратить его в плоскую последовательность из 1 и 0, затем взять эту последовательность из 1 и 0 (возможно, в другом месте, возможно, в другое время) и восстановить исходное сложное ». что-то."

    Итак, реализуйте Serializableинтерфейс, когда вам нужно сохранить копию объекта, отправить его другому процессу, который выполняется в той же системе или по сети.

  2. Потому что вы хотите сохранить или отправить объект.

  3. Это облегчает хранение и отправку объектов. Это не имеет ничего общего с безопасностью.

moinudin
источник
4
Является ли наилучшей практикой реализация интерфейса seriablizble для всех моделей предметной области ...
theJava
8
@theJava Это не вопрос лучших практик. Вопрос в том, нужна ли вам серия байтов.
Мойнудин
5
При использовании JSON вам не нужно реализовывать этот интерфейс, и вы можете просто отправить эту строку ... поэтому я все еще не уверен, зачем использовать этот интерфейс, когда вы можете использовать JSON.
Йонатан Нир
1
@YonatanNir Я не уверен, почему можно использовать JSON, когда MsgPack, Avro, Thrift или Protobuf лучше подходят для передачи ввода-вывода.
OneCricketeer
1
@YonatanNir Строго определенная схема лучше. И JSON предназначен для чтения человеком, в то время как двоичные закодированные форматы намного более эффективны по проводам
OneCricketeer
48
  1. Реализуйте Serializableинтерфейс, когда вы хотите иметь возможность преобразовать экземпляр класса в серию байтов или когда вы думаете, что Serializableобъект может ссылаться на экземпляр вашего класса.

  2. Serializable классы полезны, когда вы хотите сохранить их экземпляры или отправить их по проводам.

  3. Экземпляры Serializableклассов могут быть легко переданы. Однако сериализация имеет некоторые последствия для безопасности. Прочитайте « Эффективная Java» Джошуа Блоха .

Стив Эммерсон
источник
32

Ответ на этот вопрос, возможно, удивительно, никогда , или более реалистично, только когда вы вынуждены взаимодействовать с унаследованным кодом . Это рекомендация в Effective Java, 3-е издание Джошуа Блоха:

Нет никакой причины использовать сериализацию Java в любой новой системе, которую вы пишете

По словам главного архитектора Oracle Марка Рейнхольда, устранение существующего механизма сериализации Java является долгосрочной целью.


Почему Java-сериализация имеет недостатки

Java как часть языка предоставляет схему сериализации, в которую вы можете включить использование Serializableинтерфейса. Эта схема, однако, имеет несколько неразрешимых недостатков и должна рассматриваться разработчиками языка Java как неудачный эксперимент.

  • Это принципиально делает вид , что можно говорить о в последовательной форме объекта. Но существует бесконечно много схем сериализации, что приводит к бесконечному количеству сериализованных форм. При наложении одной схемы без какого-либо изменения схемы приложения не могут использовать схему, наиболее подходящую для них.
  • Он реализован как дополнительное средство конструирования объектов, которое обходит любые предварительные проверки, выполняемые вашими конструкторами или фабричными методами. Если не будет написан сложный, подверженный ошибкам и трудный для тестирования код дополнительной десериализации, ваш код, вероятно, имеет существенную уязвимость безопасности.
  • Проверка совместимости разных версий сериализованной формы очень сложна.
  • Работа с неизменяемыми объектами хлопотна.

Что делать вместо

Вместо этого используйте схему сериализации, которую вы можете явно контролировать. Например, протокол буфера, JSON, XML или ваша собственная схема.

Raedwald
источник
2
не так много экспертов на этом уровне, но чувствую, что у вас есть точка.
Nightfury
1
Я думаю, что это лучший ответ!
Джандзур