Почему у Java есть временные поля?
transient
Ключевое слово в Java используется для указания того, что поле не должно быть частью сериализации (спасшая средства, как в файл) процесс.
Из спецификации языка Java, Java SE 7 Edition , раздел 8.3.1.3. transient
Поля :
Переменные могут быть помечены,
transient
чтобы указать, что они не являются частью постоянного состояния объекта.
Например, у вас могут быть поля, которые получены из других полей, и должны выполняться только программно, а не сохраняться в состоянии посредством сериализации.
Вот GalleryImage
класс, который содержит изображение и эскиз, полученный из изображения:
class GalleryImage implements Serializable
{
private Image image;
private transient Image thumbnailImage;
private void generateThumbnail()
{
// Generate thumbnail.
}
private void readObject(ObjectInputStream inputStream)
throws IOException, ClassNotFoundException
{
inputStream.defaultReadObject();
generateThumbnail();
}
}
В этом примере thumbnailImage
это миниатюрное изображение, которое генерируется путем вызова generateThumbnail
метода.
thumbnailImage
Поле помечается как transient
, поэтому только в оригиналеimage
сериализация , а не сохраняющиеся как исходное изображения и уменьшенное изображение. Это означает, что для сохранения сериализованного объекта потребуется меньше места. (Конечно, это может или не может быть желательно в зависимости от требований системы - это только пример.)
Во время десериализации readObject
метод вызывается для выполнения любых операций, необходимых для восстановления состояния объекта обратно в состояние, в котором произошла сериализация. Здесь, миниатюра должна быть сгенерирована, поэтому readObject
метод переопределяется, чтобы миниатюра была сгенерирована путем вызова generateThumbnail
метода.
Для получения дополнительной информации статья « Раскройте секреты API сериализации Java» (которая первоначально была доступна в Sun Developer Network) содержит раздел, в котором обсуждается использование и представлен сценарий, в котором используется transient
ключевое слово для предотвращения сериализации определенных полей.
@DoNotSerialize
?Прежде чем понять
transient
ключевое слово, нужно понять концепцию сериализации. Если читатель знает о сериализации, пропустите первый пункт.Что такое сериализация?
Сериализация - это процесс сохранения состояния объекта. Это означает, что состояние объекта преобразуется в поток байтов, который используется для сохранения (например, хранения байтов в файле) или передачи (например, отправки байтов по сети). Таким же образом, мы можем использовать десериализацию, чтобы вернуть состояние объекта из байтов. Это одна из важных концепций в Java-программировании, потому что сериализация в основном используется в сетевом программировании. Объекты, которые должны быть переданы через сеть, должны быть преобразованы в байты. Для этого каждый класс или интерфейс должен реализовывать
Serializable
интерфейс. Это маркерный интерфейс без каких-либо методов.Теперь, каково
transient
ключевое слово и его цель?По умолчанию все переменные объекта преобразуются в постоянное состояние. В некоторых случаях вы можете избежать сохранения некоторых переменных, потому что вам не нужно сохранять эти переменные. Таким образом, вы можете объявить эти переменные как
transient
. Если переменная объявлена какtransient
, она не будет сохранена. Это основная цельtransient
ключевого слова.Я хочу объяснить два приведенных выше пункта следующим примером:
И вывод будет следующим:
Второе имя объявляется как
transient
, поэтому оно не будет храниться в постоянном хранилище.Источник
источник
NameFormatter
подержанную машинуtoString()
. Или что-нибудь еще, связанное с настройкой, просмотром или бизнес-логикой, а не с данными.Чтобы позволить вам определить переменные, которые вы не хотите сериализовать.
В объекте у вас может быть информация, которую вы не хотите сериализовать / сохранять (возможно, ссылка на родительский объект фабрики), или, возможно, нет смысла сериализовать. Отметив их как «переходные» означает, что механизм сериализации будет игнорировать эти поля.
источник
Мой маленький вклад:
Что такое переходное поле?
По сути, любое поле, измененное с помощью
transient
ключевого слова, является временным полем.Зачем нужны переходные поля в Java? Ключевое слово дает некоторый контроль над процессом сериализации и позволяет исключить некоторые свойства объектов из этого процесса. Процесс сериализации используется для сохранения Java-объектов, главным образом для того, чтобы их состояния могли сохраняться во время их передачи или неактивности. Иногда имеет смысл не сериализовать определенные атрибуты объекта. Какие поля следует пометить как переходные? Теперь мы знаем цель
transient
transient
ключевые слова и переходные поля, важно знать, какие поля помечать переходные. Статические поля также не сериализуются, поэтому соответствующее ключевое слово также поможет. Но это может испортить дизайн вашего класса; Вот гдеtransient
ключевое слово приходит на помощь. Я стараюсь не допустить сериализации полей, значения которых могут быть получены из других, поэтому я отмечаю их как временные. Если у вас есть поле с именемinterest
, значение которого можно вычислить из других полей (principal
,rate
&time
), нет необходимости его сериализации.Еще один хороший пример - количество слов в статье. Если вы сохраняете всю статью, вам не нужно сохранять количество слов, потому что оно может быть вычислено, когда статья будет «десериализована». Или подумайте о регистраторах;
Logger
экземпляры почти никогда не нужно сериализовать, поэтому их можно сделать временными.источник
transient
transient
transient
Переменная является переменной , которая не может быть сериализации.Один из примеров того, когда это может оказаться полезным, - это переменные, которые имеют смысл только в контексте конкретного экземпляра объекта и становятся недействительными после сериализации и десериализации объекта. В этом случае полезно, чтобы эти переменные стали
null
вместо них, чтобы при необходимости вы могли повторно инициализировать их с полезными данными.источник
transient
используется, чтобы указать, что поле класса не должно быть сериализовано. Вероятно, лучший пример - этоThread
поле. Обычно нет причин для сериализации aThread
, так как его состояние очень специфично для потока.источник
A
ссылается на не сериализуемый классB
(какThread
в вашем примере), тоA
должен либо пометить ссылку, так какtransient
XOR должен переопределить процесс сериализации по умолчанию, чтобы сделать что-то разумное сB
XOR, предполагая, что только сериализуемые подклассыB
фактически ссылаются (поэтому фактический подкласс должен заботиться об их «плохом» родителеB
) XOR признает, что сериализация не удастся. Только в одном случае (помеченном как переходный процесс)B
автоматически и тихо пропускается.Системы сериализации, кроме нативной Java, также могут использовать этот модификатор. Например, Hibernate не сохранит поля, помеченные либо @Transient, либо модификатором transient . Терракота также уважает этот модификатор.
Я полагаю, что переносное значение модификатора таково: «Это поле предназначено только для использования в памяти. Не сохраняйте и не перемещайте его вне этой конкретной ВМ. Оно непереносимо». то есть вы не можете полагаться на его значение в другой области памяти виртуальной машины. Как и volatile, вы не можете полагаться на определенную семантику памяти и потоков.
источник
transient
это не было бы ключевое слово, если бы оно было разработано в это время. Возможно, они будут использовать аннотацию.Потому что не все переменные имеют сериализуемую природу
источник
Прежде чем ответить на этот вопрос, я должен объяснить вам СЕРИАЛИЗАЦИЮ , потому что, если вы понимаете, что означает сериализация в научном компьютере, вы легко поймете это ключевое слово.
Сериализация Когда объект передается через сеть / сохраняется на физическом носителе (файл, ...), объект должен быть «сериализован». Сериализация преобразует байты серии объектов статуса. Эти байты отправляются по сети / сохраняются, и объект воссоздается из этих байтов.
пример
Теперь, ЕСЛИ ВЫ ХОТИТЕ НЕ ПЕРЕДАТЬ / СОХРАНИТЬ поле этого объекта ТАК , вы можете использовать ключевое слово
transient
пример
источник
Это необходимо, когда вы не хотите делиться некоторыми конфиденциальными данными, которые идут с сериализацией.
источник
Thread
(например, кредит @AH), и в этом случае вы отметите его как временный. Однако поток сам по себе не является конфиденциальными данными, просто нет логического смысла его сериализации (и он не сериализуем).Согласно переходному значению Google == длительность только в течение короткого времени; непостоянно.
Теперь, если вы хотите сделать что-то временное в Java, используйте ключевое слово transient.
Q: где использовать переходный процесс?
A: Как правило, в Java мы можем сохранять данные в файлы, собирая их в переменные и записывая эти переменные в файлы, этот процесс известен как сериализация. Теперь, если мы хотим избежать записи переменных данных в файл, мы бы сделали эту переменную переходной.
Примечание: временные переменные не могут быть локальными.
источник
Проще говоря, временное ключевое слово java защищает поля от бывшего Serialize в качестве их непереходных полей.
В этом фрагменте кода наш абстрактный класс BaseJob реализует интерфейс Serializable, который мы расширяем от BaseJob, но нам не нужно сериализовать удаленные и локальные источники данных; сериализовать только поля organizationName и isSynced.
источник
Упрощенный пример кода для переходного ключевого слова.
источник
Поле, которое объявляется с помощью временного модификатора, не будет участвовать в сериализованном процессе. Когда объект сериализуется (сохраняется в любом состоянии), значения его переходных полей игнорируются в последовательном представлении, в то время как поле, отличное от переходных полей, будет участвовать в процессе сериализации. Это основная цель переходного ключевого слова.
источник