Коли ми повинні реалізувати інтерфейс 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. Це дає якісь переваги чи безпеку?

1
FYI прийнята відповідь тут неповна і вводить в оману, оскільки вона не вирішує недоліки безпеки. Див. Ефективна Java , пункт 86: Реалізація Serializable з великою обережністю. Тут відповідь Редвальда про те, що не використовувати серіалізацію, є правильним.
Натан Х'юз

Відповіді:


157
  1. З чого це все "серіалізація"? :

    Це дозволяє вам взяти об’єкт або групу об'єктів, покласти їх на диск або відправити їх через провідний або бездротовий транспортний механізм, а потім пізніше, можливо, на інший комп'ютер, змінити процес: воскресити оригінальний об’єкт (и). Основні механізми полягають у згладжуванні об'єктів (-ів) в одновимірному потоці бітів та поверненні цього потоку бітів назад в початковий (-і) об'єкт (-и).

    Як і Транспортер у Star Trek, справа полягає в тому, щоб взяти щось складне і перетворити його на рівну послідовність 1s і 0s, потім взяти цю послідовність 1s і 0s (можливо, в іншому місці, можливо, в інший час) і реконструювати оригінальний складний " щось ».

    Отже, реалізуйте Serializableінтерфейс, коли вам потрібно зберегти копію об’єкта, надішліть їх іншому процесу, який працює в тій же системі або по мережі.

  2. Тому що ви хочете зберігати або відправляти об’єкт.

  3. Це дозволяє легко зберігати та відправляти об'єкти. Це не має нічого спільного з безпекою.


4
Це найкраща практика впроваджувати серіаблізний інтерфейс для всіх моделей домену ...
theJava

8
@theJava Це не питання найкращої практики. Це питання про те, чи потрібно вам чинити ряд байтів чи ні.
moinudin

5
Під час використання JSON вам не доведеться реалізовувати цей інтерфейс, а ви можете просто надіслати цей рядок. Тому я все ще не знаю, навіщо використовувати цей інтерфейс, коли ви можете використовувати JSON.
Йонатан Нір

1
@YonatanNir Я не впевнений, чому можна використовувати JSON, коли MsgPack, Avro, Thrift або Protobuf краще для передачі IO.
OneCricketeer

1
@YonatanNir Строго визначена схема краще. І JSON призначений для людського читання, тоді як двійкові кодовані формати набагато ефективніші за допомогою дроту
OneCricketeer

48
  1. Реалізуйте Serializableінтерфейс, коли ви хочете мати можливість перетворити екземпляр класу в ряд байтів або коли ви думаєте, що Serializableоб'єкт може посилатися на екземпляр вашого класу.

  2. Serializable класи корисні, коли ви хочете зберегти їх екземпляри або надіслати їх по дроту.

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


32

Відповідь на це запитання, можливо, дивно, ніколи , або більш реально, лише тоді, коли вас змушують до сумісної роботи зі застарілим кодом . Це рекомендація в Ефективній Java, 3-е видання Джошуа Блоха:

Немає підстав використовувати серіалізацію Java в будь-якій новій системі, яку ви пишете

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


Чому серіалізація Java недолікована

Java забезпечує частину мови схему серіалізації, до якої можна ввімкнути, використовуючи Serializableінтерфейс. Однак ця схема має кілька недоступних недоліків, і її слід розглядати як невдалий експеримент розробниками мови Java.

  • Це принципово вдає , що можна говорити про в послідовній формі об'єкта. Але існує нескінченно багато схем серіалізації, внаслідок чого утворюється нескінченно багато серіалізованих форм. Накладаючи одну схему, не змінюючи схеми, додатки не можуть використовувати найбільш відповідну для них схему.
  • Він реалізований як додатковий засіб побудови об'єктів, що обходить будь-яку передумову перевірки, яку виконують ваші конструктори чи заводські методи. Якщо не написано хитрості, схильності до помилок і важко перевірити додатковий код десеріалізації, ваш код, ймовірно, має слабку слабкість безпеки.
  • Тестувати сумісність різних версій серіалізованої форми дуже важко.
  • Поводження з незмінними предметами є клопітким.

Що робити замість цього

Натомість використовуйте схему серіалізації, яку ви можете чітко контролювати. Наприклад, буфери протоколів, JSON, XML або ваша власна спеціальна схема.


2
не так багато експертів на цьому рівні, але відчуваєте, що у вас є точка.
nightfury

1
Я думаю, що це найкраща відповідь!
jjanczur
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.