Сериализуемый и переходный
Чтобы сделать сериализуемый класс, мы делаем следующее:
class A implements Serializable {
transient Object a;
}
И не это:
serializable class A {
transient Object a;
}
Почему, если мы хотим сделать сериализуемый класс, мы реализуем специальный интерфейс. И если мы хотим исключить некоторые поля, мы используем ключевое слово transient
?
Почему в обоих случаях не используются специальные ключевые слова? Я имею в виду, есть ли какие-то причины сделать одно и то же по-разному? Я знаю, нет такого ключевого слова, как serializable
, но почему он не был введен вместо специального интерфейса serializable
?
Ответы
Ответ 1
Почему не используется какое-либо специальное ключевое слово для маркировать классы как сериализуемые тоже? Интерфейс Serializable выглядит как магические числа в коде, а не как язык.
Я думаю, вы должны смотреть на это по-другому: языковые ключевые слова существуют в основном для поддержки языковых конструкций компиляции. Сериализация - это механизм времени выполнения. Кроме того, вы не хотите иметь лишнее ключевое слово для всего, потому что тогда вы не можете использовать его как идентификатор. С другой стороны, интерфейс маркера гораздо менее интрузивен.
Возникает вопрос: почему нам нужно ключевое слово языка для отметки полей переходных процессов? И ответ заключается в том, что в то время не было другого способа отмечать определенные поля.
В настоящее время для этих целей можно использовать аннотации для обоих случаев (и для других вещей, таких как неясное ключевое слово strictfp
).
Ответ 2
Serializable
- интерфейс маркера. Интерфейсы являются стандартным способом (в Java и некоторых других языках), указывающими функции класса; "является" отношением ". Создание Serializable
интерфейса означает, что мы можем объявлять методы, которые принимают или возвращают Serializable
так же, как мы можем методы, которые работают с другими интерфейсами. Все остальное потребовало бы синтаксических изменений языка (в то время, теперь у нас есть аннотации, но я думаю, что интерфейс все равно будет использоваться).
Ответ 3
Итак, вы спрашиваете, почему вы не можете пометить класс как не сериализуемый (например, переходный элемент)? Почему бы вам просто не пометить членов класса типа not-to-serialize как переходный? Или используйте сериализационный делегат для этого типа, когда вы выполняете сериализацию? Кажется немного странным, что вы хотели бы сказать Java не делать что-то на этом уровне, а не сообщать что-то.
Ответ 4
Serializable
- это интерфейс маркера (например, Cloneable
), который используется для установки флага стандартного кода библиотеки времени выполнения Java, который может быть сериализован в соответствии с конструктором этого класса.
Ключевое слово transient
может использоваться для указания того, что атрибут не нужно сериализовать, например, потому что он является производным атрибутом.
См. также этот ответ на аналогичный вопрос о SO и этот об проектировании интерфейсов маркеров.
Обновить
Почему маркерные интерфейсы и нет ключевых слов для таких вещей, как сериализация, клонирование и т.д.? Мое предположение было бы возможностью последовательно расширять Java runtime lib с помощью новых интерфейсов маркеров в сочетании со слишком многими ключевыми словами, если поведенческие аспекты превратили его в язык.
Тот факт, что атрибуты класса не могут реализовать интерфейсы и transient
, можно рассматривать как общее свойство атрибута, имеет смысл вводить transient
в качестве ключевого слова языка.
Ответ 5
Временные ключевые слова используются для защиты переменной или поля от хранения, и мы делаем это для защиты конфиденциальной информации, которую мы просто не хотим распространять в каждом месте, и мы используем интерфейс Serializable для создания класса Serializable. Хотя мы также можем использовать интерфейс Externalizable, но мы предпочитаем использовать Serializable из-за некоторых преимуществ.
Пойдите, хотя это, чтобы четко понимать ключевое слово Serialization и transient.
http://www.codingeek.com/java/io/object-streams-serialization-deserialization-java-example-serializable-interface/