Сериализуемый и переходный

Чтобы сделать сериализуемый класс, мы делаем следующее:

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/