Чому java має перехідні поля field - transient, code q - a російська (ru)

Ключове слово transient в Java використовується для вказівки того, що поле не повинно бути серіалізовані.

Змінні можуть бути позначені як transient щоб вказати, що вони не є частиною постійного стану об'єкта.







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

Ось клас GalleryImage який містить зображення та мініатюру, отримані з зображення:

У цьому прикладі thumbnailImage є зменшене зображення, яке генерується шляхом виклику методу generateThumbnail.

Поле thumbnailImage позначено як transient. тому тільки вихідне image серіалізуются, а не зберігається як вихідне зображення, так і зменшене зображення. Це означає, що для збереження серіалізовані об'єкта буде потрібно менше сховища. (Звичайно, це може бути чи не бути бажаним в залежності від вимог системи - це просто приклад.)

Під час десеріалізациі метод readObject викликається для виконання будь-яких операцій, необхідних для відновлення стану об'єкта назад в стан, в якому сталася сериализация. Тут потрібно створити ескіз, тому метод readObject переопределяется, так що ескіз буде генеруватися шляхом виклику методу generateThumbnail.

Для отримання додаткової інформації в розділі «Познайомтеся з секретами статті API Java Serialization» (яка спочатку була доступна в Sun Developer Network) є розділ, в якому йде мова про використання та представлення сценарію, в якому ключове слово transient використовується для запобігання сериализации певних полів.

Перш ніж розуміти ключове слово transient. потрібно зрозуміти концепцію сериализации. Якщо читач знає про сериализации, пропустіть першу точку.

Що таке сериализация?

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

Тепер, яке transient ключове слово і його мета?

За замовчуванням всі змінні об'єкта перетворюються в постійний стан. У деяких випадках вам може знадобитися уникати збереження деяких змінних, оскільки вам не потрібно зберігати ці змінні. Таким чином, ви можете оголосити ці змінні transient. Якщо змінна оголошена як transient. то вона не буде збережена. Це основна мета ключового слова transient.

Я хочу пояснити такі два моменти наступним прикладом:

І вихід буде наступним:

Середнє ім'я оголошується transient. тому воно не буде зберігатися в постійному сховищі.

Щоб ви могли визначати змінні, які ви не хочете серіалізовать.

В об'єкті у вас може бути інформація, яку ви не хочете серіалізовать / персистувати (можливо, посилання на батьківський заводский об'єкт), або, можливо, це не має сенсу для сериализации. Помістивши їх як «перехідні», механізм серіалізациі ігноруватиме ці поля.







Мій невеликий внесок:

Що таке перехідна змінна в Java?
У простому реченні будь-яка змінна, яка змінюється за допомогою ключового слова transient, стає змінною перехідного процесу в java.

Навіщо нам потрібна перехідна змінна в java?
Ключове слово Transient надає вам деякий контроль над процесом сериализации і дає вам можливість виключити деякі властивості об'єктів з процесу сериализации. Деякий час має сенс не серіалізовивать певні атрибути об'єкта, ми побачимо, які змінні не повинні бути серіалізовані і повинні бути минущими в наступному розділі.

Перехідна змінна - це змінна, яка не може бути серіалізовані.

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

transient використовується для вказівки того, що поле класу не потрібно серіалізовать. Ймовірно, найкращим прикладом є поле Thread. Зазвичай немає причин для сериализации Thread. оскільки його стан дуже «специфічно для потоку».

Оскільки не всі змінні мають Серіалізуемое природу

Крім того, цей модифікатор може використовувати системи сериализации, відмінні від рідної Java. Наприклад, Hibernate НЕ буде зберігати поля, відмічені або @Transient, або тимчасовим модифікатором. Теракота також поважає цей модифікатор.

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

Серіалізация - це процес збереження станів об'єкта в постійному форматі (наприклад, потік файлів або бази даних) і подальше відновлення їх з потоку (де-сериализация). В Java об'єкт класу серіалізуются, якщо клас реалізує інтерфейс java.io.Serializable. Це інтерфейс маркера, який повідомляє JVM, що клас має право на сериализацию.

В цьому класі моделі є три важливих моменти: він повинен реалізовувати інтерфейс Serializable. В іншому випадку ми отримаємо java.io.NotSerializableException при спробі сериализации об'єкта класу. Константа з ім'ям serialVersionUID оголошується і призначається довге значення:

Зверніть увагу, що поле пароля відзначено як перехідний:

Тому що ми не хочемо зберігати пароль при серіалізациі об'єкта. Правило полягає в тому, що коли змінна відзначена як перехідна, її об'єкт не буде серіалізовані під час сериализации.

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

Модифікатори доступу, підтримувані Java, є статичними, кінцевими, абстрактними, синхронізованими, нативними, нестійкими, тимчасовими і строгими.

У наступній таблиці наведено список специфікаторів доступу і модифікаторів Java, які можуть застосовуватися до змінних, методів і класів.

Перш ніж відповісти на це питання, я повинен пояснити вам SERIALIZATION. тому що, якщо ви розумієте, що означає сериализация в науковому комп'ютері, ви можете легко переконатися в цьому ключове слово.

Серіалізация Коли об'єкт передається через мережу / зберігається на фізичному носії (файл.), Об'єкт повинен бути «серіалізовані». Серіалізация перетворює ряди об'єктів стану байтів. Ці байти відправляються в мережі / зберігаються, і об'єкт відтворюється з цих байтів.
приклад

Тепер, ЯКЩО ВИ ХОЧЕТЕ НЕ ПЕРЕЗАВАНТАЖИТИ / СБЕРЕЖАТЬ поле цього об'єкта. SO. ви можете використовувати transient ключового слова

Це необхідно, коли ви не хочете ділитися конфіденційними даними, які йдуть з сериализацией.

Відповідно до тимчасовим значенням google, яке триває лише на короткий час; НЕ постійно.

Тепер, якщо ви хочете зробити що-небудь минуще в java, використовуйте ключове слово transient.

Питання: де використовувати перехідний процес?

A: Зазвичай в java ми можемо зберігати дані у файли, купуючи їх в змінних і записуючи ці змінні в файли, цей процес називається Serialization. Тепер, якщо ми хочемо, щоб змінні дані записувалися в файл, ми зробили б цю змінну перехідною.

Transient int result = 10;

Примітка: перехідні змінні не можуть бути локальними.







Схожі статті