Сериализуемый и временный - PullRequest
10 голосов
/ 17 декабря 2009

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

class A implements Serializable {
    transient Object a;
}

А не это:

serializable class A {
   transient Object a;
}

Почему, если мы хотим сделать сериализуемый класс, мы реализуем специальный интерфейс . И если мы хотим исключить некоторые поля, мы используем ключевое слово transient? Почему в обоих случаях не используются специальные ключевые слова? Я имею в виду, были ли причины делать одно и то же по-разному? Я знаю, что нет такого ключевого слова как serializable, но почему оно не было введено вместо специального интерфейса Serializable?

Ответы [ 5 ]

27 голосов
/ 17 декабря 2009

Почему не используется какое-то специальное ключевое слово для пометить классы как сериализуемые тоже? Сериализуемый интерфейс выглядит как магические числа в коде, а не как языковая особенность.

Я думаю, вы должны взглянуть на это иначе: ключевые слова языка существуют в основном для поддержки языковых конструкций времени компиляции. Сериализация является механизмом выполнения. Кроме того, вам не нужно иметь дополнительное ключевое слово для всего, потому что вы не сможете использовать его в качестве идентификатора. Интерфейс маркера, с другой стороны, гораздо менее навязчив.

Вопрос, таким образом, таков: зачем нам ключевое слово языка для обозначения переходных полей? И ответ таков: в то время просто не было другого способа пометить определенные поля.

В настоящее время для этой цели можно использовать аннотации в обоих случаях (и для других вещей, таких как скрытое ключевое слово strictfp).

3 голосов
/ 17 декабря 2009

Serializable является интерфейсом маркера. Интерфейсы являются стандартным способом (в Java и в некоторых других языках) указания функций класса; отношение "есть". Создание Serializable интерфейса означает, что мы можем объявить методы, которые принимают или возвращают Serializable s, точно так же, как мы можем методы, которые работают с другими интерфейсами. Все остальное потребовало бы изменения синтаксиса языка (в то время, теперь у нас есть аннотации, но я думаю, что интерфейс все еще будет использоваться).

0 голосов
/ 10 декабря 2014

Временные ключевые слова используются для защиты переменной или поля от сохранения, и мы делаем это для защиты важной информации, которую мы просто не хотим распространять в каждом месте, и мы используем интерфейс Serializable, чтобы сделать класс Serializable. Хотя мы можем также использовать интерфейс Externalizable, но мы предпочитаем использовать Serializable из-за некоторых преимуществ.

Сделайте это, чтобы четко понимать сериализацию и временные ключевые слова. http://www.codingeek.com/java/io/object-streams-serialization-deserialization-java-example-serializable-interface/

0 голосов
/ 17 декабря 2009

Serializable - это интерфейс маркера (например, Cloneable), который используется для установки флага для стандартного кода библиотеки времени выполнения Java, согласно которому объект может быть сериализован в соответствии с разработчиком этого класса.

Ключевое слово transient можно использовать для указания того, что атрибут не нуждается в сериализации, например, потому что он является производным атрибутом.

См. Также этот ответ на аналогичный вопрос о SO и этот вопрос о разработке интерфейсов маркеров .

Обновление

Почему маркерные интерфейсы и отсутствие ключевых слов для таких вещей, как сериализация, клонирование и т. Д.? Я предполагаю, что будет возможность последовательно расширять библиотеку времени выполнения Java новыми интерфейсами маркеров в сочетании со слишком большим количеством ключевых слов, если поведенческие аспекты проникнут в язык.

Тот факт, что атрибуты класса не могут реализовывать интерфейсы, а transient можно рассматривать как универсальное свойство атрибута, имеет смысл ввести transient в качестве ключевого слова языка.

0 голосов
/ 17 декабря 2009

Итак, вы спрашиваете, почему нельзя пометить класс как не сериализуемый (например, временный член)? Почему бы вам просто не пометить членов класса типа «не для сериализации» как переходные? Или использовать делегат сериализации для этого типа класса, когда вы делаете сериализацию? Кажется немного странным, что вы бы хотели, чтобы Java не что-то делал на этом уровне, вместо того, чтобы to что-то делать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...