Яка мета серіалізації на Java?


105

Я прочитав досить багато статей про серіалізацію та про те, як це так приємно і чудово, але жоден з аргументів не був достатньо переконливим. Мені цікаво, чи дійсно хтось може сказати мені, що ми можемо реально досягти, серіалізуючи клас?


10
Що "не було переконливим" у їхніх аргументах? І чому ви не прийняли жодної відповіді на свої запитання?
Анон.

8
Він "не був переконаний", вони відповіли на його запитання.
Ентоні Форлоні

5
Надані відповіді були насправді правильними. Якщо вони не працюють для вас, відповідайте на них як на коментарі і намагайтеся розробити це замість того, щоб просто ігнорувати їх, а потім починати плакати на інших, коли вони вказують, що ви не використовуєте ТАК правильно.
Анон.

4
Anon сприяє якості сайту, відмовляючи від повторних питань. Нерозумно бачити п’ять окремих питань, які всі задають одне і те ж. Якщо ви не можете отримати відповідь, то іноді це просто так. Якщо ви отримаєте відповідь, але це, здається, не працює, продовжуйте обговорення в коментарях. Так що це не чарівна скринька, яка магічно дасть вам відповідь, якщо ви просто задасте правильне запитання, або задасте достатньо разів, або зачепить око потрібного експерта.
Кріс

1
Або: (Прийміть відповідь) або (Опублікуйте коментар та / або внесіть зміни до питання, пояснюючи, чому це не те, що вам потрібно).
Анон.

Відповіді:


182

Давайте спочатку визначимо серіалізацію, потім можна поговорити про те, чому це так корисно.

Серіалізація - це просто перетворення існуючого об'єкта в байтовий масив. Цей байтний масив представляє клас об'єкта, версію об'єкта та внутрішній стан об'єкта. Цей байтовий масив може бути використаний між тим самим кодом JVM для передачі / зчитування об'єкта.

Чому ми б хотіли це робити?

Є кілька причин:

  • Спілкування: Якщо у вас є дві машини, які працюють з одним і тим же кодом, і їм потрібно зв’язуватися, на одній машині простий спосіб зібрати об'єкт з інформацією, яку він хотів би передати, а потім серіалізувати цей об'єкт на іншій машині. Це не найкращий метод спілкування, але він робить роботу.

  • Наполегливість: Якщо ви хочете зберігати стан певної операції в базі даних, її можна легко серіалізувати в байтовий масив і зберігати в базі даних для подальшого пошуку.

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

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

  • Поперечна синхронізація JVM: серіалізація працює в різних JVM, які можуть працювати в різних архітектурах.


62
Що на Землі потрібно 10 хвилин для побудови?
oxbow_lakes

2
Моя думка, ясна річ, що введення / виведення файлів, що беруть участь у серіалізації, швидше за все, придушує будь-яке створення об'єкта. Я думаю, ви можете говорити про щось обчислювально дуже дороге, як наукове моделювання, але серіалізація - це дуже поганий механізм стійкості, оскільки важко обробляти зміни схеми
oxbow_lakes

11
@oxbow_lakes Приклад може бути, якщо ви підтримуєте індекс певного набору даних для швидкого пошуку. Такий індекс може зайняти дуже багато часу, але коли ви його побудуєте, його можна відносно швидко серіалізувати / де-серіалізувати.
Девід

Якщо запит веб-додатків повинен пройти кожен маршрутизатор у всьому світі, перш ніж дістатись до пункту призначення, будувати об’єкт, повертатися назад із об’єктом, використовуючи найдовший можливий шлях, так, це може зайняти 10 хвилин.
Вайбс

@Schmelter, Оскільки ви згадуєте, що серіалізація не є найкращим методом спілкування, який є вдалим та найкращим методом, який слід реалізувати тоді?
Ashfaque Rifaye

58

Поки ви запускаєте свою програму, всі її об'єкти зберігаються в пам'яті (RAM). Коли ви виходите, оперативна система пам'ять відновлює, і ваша програма по суті 'забуває' все, що сталося під час її роботи. Серіалізація усуває це, дозволяючи вашій програмі зберігати об’єкти на диску, щоб вона змогла прочитати їх наступного разу, коли вона запуститься. Якщо ваша програма надасть будь-який спосіб збереження / спільного використання попереднього стану, вам знадобиться певна форма серіалізації.


2
Отже, здається, що це просто кращий і ефективніший спосіб запису даних у файл та читання їх назад при необхідності?
m_a_khan

1
Це єдине РЕАЛЬНЕ пояснення. Я не можу придумати жодного іншого реального світу застосування серіалізації +1
Емілі

Короткий і милий. Ідеальне пояснення.
Yakhoob

21

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

У мене було кілька проектів, які потрібно завантажити і прочитати купу текстових файлів. У файлах були слова стоп, біомедичні дієслова, біомедичні абревіатури, слова, семантично пов'язані між собою тощо. Вміст цих файлів простий: слова !

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

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


1
У такому випадку, чому вам потрібно зберігати їх у потоці байтових масивів (використовуючи серіалізацію), це може бути простіше, ніж просто використовувати тимчасове поле?
kidnan1991

3

По суті :

Серіалізація - це процес перетворення набору об'єктних екземплярів, що містять посилання один на одного, в лінійний потік байтів, який потім може бути надісланий через сокет, збережений у файл або просто маніпульований як потік даних

Дивіться використання від Вікі :

Серіалізація має ряд переваг. Він передбачає:

  1. метод збереження об'єктів, який є більш зручним, ніж записування їх властивостей у текстовий файл на диску, і повторна збірка, прочитавши це ще раз.
  2. метод видачі віддалених процедурних дзвінків, наприклад, як у SOAP
  3. метод розповсюдження об'єктів, особливо в компонентах програмного забезпечення, таких як COM, CORBA тощо.
  4. метод виявлення змін змінних за часом даних.

1

Найбільш очевидним є те, що ви можете передавати серіалізований клас по мережі, і одержувач може сконструювати дублікат оригінальної інстанції. Так само ви можете зберегти серіалізовану структуру у файловій системі.

Також зауважте, що серіалізація є рекурсивною, тому ви можете серіалізувати цілу гетерогенну структуру даних в одній набряклій петлі.


0

Серіалізовані об'єкти підтримують стан у просторі, вони можуть переноситися через мережу, файлову систему тощо ... та час, вони можуть переживати JVM, який їх створив.

Іноді це корисно.


Цього можна досягти і за допомогою простого файлу, що містить деякий текст. Трохи простіше читати назад серіалізований об’єкт, а потім читати стан об'єкта, записаного у текстовий файл, правильно?
м_а_хан

@m_a_khan: Нічого собі Так, це можна зробити простим текстом. Але як тільки Об'єкти стануть складнішими, або краще їхні структури (складання, успадкування) стануть складнішими, це стане клопотом вручну (не) їх зруйнувати. Уявіть, що списки, набори та карти є членами об'єкта.
Дірк Шумахер

Легко придумати різні схеми серіалізації і насправді багато існує. З дуже поважних причин жодна з них не призводить до загального випадку в "простому тексті"
Девід Сороко

0

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


1
На мою думку, пошук і використання одного конфігураційного об'єкта в якості параметра є досить ортогональними. Ймовірно, це не типовий випадок використання.
Габор Бакос

0

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

З іншого боку, серіалізація передає речі безпосередньо в комп'ютерну мову. Це як ви говорити іспанському комп’ютеру щось по-іспанськи, а не розповідати щось французькою, примушувати її вивчати французьку мову, а потім зберігати речі на рідній іспанській мові, перекладаючи все. Це не найінтенсивніша відповідь, я просто намагаюся створити зрозумілий приклад у загальномовному мовному форматі.

Серіалізація також швидша, тому що в Java об єкти обробляються на купі, і займають набагато більше часу, ніж якщо б вони були представлені як примітиви на стеці. Швидкість, швидкість, швидкість. І менше обробки файлів з точки зору програміста.


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