Я прочитав досить багато статей про серіалізацію та про те, як це так приємно і чудово, але жоден з аргументів не був достатньо переконливим. Мені цікаво, чи дійсно хтось може сказати мені, що ми можемо реально досягти, серіалізуючи клас?
Я прочитав досить багато статей про серіалізацію та про те, як це так приємно і чудово, але жоден з аргументів не був достатньо переконливим. Мені цікаво, чи дійсно хтось може сказати мені, що ми можемо реально досягти, серіалізуючи клас?
Відповіді:
Давайте спочатку визначимо серіалізацію, потім можна поговорити про те, чому це так корисно.
Серіалізація - це просто перетворення існуючого об'єкта в байтовий масив. Цей байтний масив представляє клас об'єкта, версію об'єкта та внутрішній стан об'єкта. Цей байтовий масив може бути використаний між тим самим кодом JVM для передачі / зчитування об'єкта.
Чому ми б хотіли це робити?
Є кілька причин:
Спілкування: Якщо у вас є дві машини, які працюють з одним і тим же кодом, і їм потрібно зв’язуватися, на одній машині простий спосіб зібрати об'єкт з інформацією, яку він хотів би передати, а потім серіалізувати цей об'єкт на іншій машині. Це не найкращий метод спілкування, але він робить роботу.
Наполегливість: Якщо ви хочете зберігати стан певної операції в базі даних, її можна легко серіалізувати в байтовий масив і зберігати в базі даних для подальшого пошуку.
Глибока копія: Якщо вам потрібна точна репліка Об'єкта, і ви не хочете піти на проблему написання власного спеціалізованого класу clone (), просто серіалізуйте об'єкт у байтовий масив, а потім де-серіалізуючи його до іншого Об'єкт досягає цієї мети.
Кешування. Дійсно, лише застосування вищезазначеного, але іноді об’єкт займає 10 хвилин для складання, але для десеріалізації потрібно лише 10 секунд. Отже, замість того, щоб утримувати гігантський об’єкт у пам'яті, просто кешуйте його у файл за допомогою серіалізації та читайте його пізніше, коли це потрібно.
Поперечна синхронізація JVM: серіалізація працює в різних JVM, які можуть працювати в різних архітектурах.
Поки ви запускаєте свою програму, всі її об'єкти зберігаються в пам'яті (RAM). Коли ви виходите, оперативна система пам'ять відновлює, і ваша програма по суті 'забуває' все, що сталося під час її роботи. Серіалізація усуває це, дозволяючи вашій програмі зберігати об’єкти на диску, щоб вона змогла прочитати їх наступного разу, коли вона запуститься. Якщо ваша програма надасть будь-який спосіб збереження / спільного використання попереднього стану, вам знадобиться певна форма серіалізації.
Я можу поділитися своєю історією і сподіваюся, що вона дасть деякі ідеї, чому необхідна серіалізація. Однак відповіді на ваше запитання вже є надзвичайно детальними.
У мене було кілька проектів, які потрібно завантажити і прочитати купу текстових файлів. У файлах були слова стоп, біомедичні дієслова, біомедичні абревіатури, слова, семантично пов'язані між собою тощо. Вміст цих файлів простий: слова !
Тепер для кожного проекту мені потрібно було прочитати слова з кожного з цих файлів і помістити їх у різні масиви; оскільки вміст файлу ніколи не змінювався, це стало загальним, хоч і зайвим завданням після першого проекту.
Отже, що я зробив, це те, що я створив один об’єкт для читання кожного з цих файлів та заселення окремих масивів (змінних екземплярів об'єктів). Потім я серіалізував об’єкти, а потім для пізніших проектів просто їх десеріалізував. Мені не довелося читати файли та заповнювати масиви знову і знову.
По суті :
Серіалізація - це процес перетворення набору об'єктних екземплярів, що містять посилання один на одного, в лінійний потік байтів, який потім може бути надісланий через сокет, збережений у файл або просто маніпульований як потік даних
Дивіться використання від Вікі :
Серіалізація має ряд переваг. Він передбачає:
- метод збереження об'єктів, який є більш зручним, ніж записування їх властивостей у текстовий файл на диску, і повторна збірка, прочитавши це ще раз.
- метод видачі віддалених процедурних дзвінків, наприклад, як у SOAP
- метод розповсюдження об'єктів, особливо в компонентах програмного забезпечення, таких як COM, CORBA тощо.
- метод виявлення змін змінних за часом даних.
Найбільш очевидним є те, що ви можете передавати серіалізований клас по мережі, і одержувач може сконструювати дублікат оригінальної інстанції. Так само ви можете зберегти серіалізовану структуру у файловій системі.
Також зауважте, що серіалізація є рекурсивною, тому ви можете серіалізувати цілу гетерогенну структуру даних в одній набряклій петлі.
Серіалізовані об'єкти підтримують стан у просторі, вони можуть переноситися через мережу, файлову систему тощо ... та час, вони можуть переживати JVM, який їх створив.
Іноді це корисно.
Я використовую серіалізовані об'єкти для стандартизації аргументів, які я передаю функціям або конструкторам класів. Пройти один серіалізований боб набагато чіткіше, ніж довгий список аргументів. Результат - код, який легше читати та налагоджувати.
З простої мети навчання (зауважте, я сказав, що я навчався, я не сказав найкраще чи навіть добре, але просто для розуміння речей), ви можете зберегти свої дані в текстовий файл на комп’ютері, а потім мати програму який читає цю інформацію, і виходячи з файлу, ви могли б дати вашій програмі відповідь по-різному. Якщо ви були більш досконалими, це не обов'язково повинен бути файлом txt, а чимось іншим.
З іншого боку, серіалізація передає речі безпосередньо в комп'ютерну мову. Це як ви говорити іспанському комп’ютеру щось по-іспанськи, а не розповідати щось французькою, примушувати її вивчати французьку мову, а потім зберігати речі на рідній іспанській мові, перекладаючи все. Це не найінтенсивніша відповідь, я просто намагаюся створити зрозумілий приклад у загальномовному мовному форматі.
Серіалізація також швидша, тому що в Java об єкти обробляються на купі, і займають набагато більше часу, ніж якщо б вони були представлені як примітиви на стеці. Швидкість, швидкість, швидкість. І менше обробки файлів з точки зору програміста.