Java: что может и что не может быть сериализовано? - программирование
Подтвердить что ты не робот

Java: что может и что не может быть сериализовано?

Если интерфейс Serializable - это просто интерфейс Marker-Interface, который используется для передачи мета-данных о классах в java - я немного запутался:

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

Короче говоря и формально:

  1. Какие данные могут вызвать NotSerializableException?
  2. Откуда мне знать, что я не должен добавлять предложение implements Serializable для моего класса?
4b9b3361

Ответ 1

Когда вы говорите о NotSerializableException, он бросает, когда вы хотите сериализовать объект, который не был помечен как Serializable - это все, хотя, когда вы расширяете несериализуемый класс и добавляете интерфейс Serializable, он отлично.

Нет данных, которые не могут быть сериализованы.

Ответ 2

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

Если ваш объект имеет ссылку (транзитивную или прямую) на любой не сериализуемый объект, и эта ссылка не помечена ключевым словом transient, то ваш объект не будет сериализуемым.

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

Ответ 3

Сериализация. Поверните данные в поток байтов.

Deserialization. Поверните поток байтов обратно в копию исходного объекта.

Сериализация в JAVA: - Serializable - это интерфейсы маркеров, которые сообщают, что JVM может записывать состояние объекта в некоторый поток (в основном читать все члены и записывать свое состояние в поток, или на диск или что-то еще). Механизм по умолчанию - это двоичный формат. Вы также можете использовать его для клонирования вещей или сохранения состояния между вызовами, отправки объектов по сети и т.д.

Переходный период: -

Ключевой переходный процесс в Java используется для указания того, что переменная не должна быть сериализована. По умолчанию все переменные в объекте преобразуются в постоянное состояние. В некоторых случаях вам может понадобиться избегать сохранения некоторых переменных, потому что у вас нет необходимости переходить по сети. Таким образом, вы можете объявить эти переменные переходными. Если переменная объявлена ​​как переходная, она не будет сохраняться. Это основная цель ключевого слова transient.

Ключевое слово Transient в java сравнительно менее распространено, чем любое другое ключевое слово, такое как volatile. Поскольку переходный процесс менее распространен, становится еще более важным понять его правильное использование. В ключевом слове одно ключевое слово используется в процессе сериализации для предотвращения сериализации любой переменной, поэтому, если у вас есть какое-либо поле, которое не имеет смысла для сериализации, вы можете просто объявить это как переходное и не будет сериализовано.

Ответ 4

Все, что есть в вашем классе Serializable, который не является Serializable, выдает это исключение. Вы можете избежать этого, используя ключевое слово transient.

Общие примеры того, что вы не можете сериализовать, включают компоненты Swing и Threads. Если вы думаете об этом, это имеет смысл, потому что вы никогда не сможете десериализовать их и иметь смысл.

Ответ 5

Все примитивные типы данных и классы распространяются непосредственно Serializable,

class MyClass extends Serializable{
}

или косвенно,

class MyClass extends SomeClass{
}

SomeClass реализует Serializable.

может быть сериализована. Все поля сериализуемого класса становятся сериализованными, за исключением полей, отмеченных transient. Если сериализуемый класс содержит поле, которое не является сериализуемым (не примитивным и не распространяется на сериализуемый интерфейс), то будет выбрано NotSerializableException.

Отвечайте на второй вопрос: как сказал @JB Nizet. Если вы собираетесь записать экземпляр класса в какой-то поток, а затем отметьте его как Serializable, иначе никогда не отмечайте класс Serializable.

Ответ 6

Вам нужно обработать сериализацию ваших собственных объектов.

Java будет обрабатывать примитивные типы данных для вас.

Дополнительная информация: http://www.tutorialspoint.com/java/java_serialization.htm

Ответ 7

NotSerialisable исключение вызывается, когда что-то в вашем сериализованном языке помечено как сериализуемое. Одним из таких случаев может быть:

class Super{}
class Sub implements Serializable
{
Super super;

Здесь супер не упоминается как сериализуемый, поэтому бросает NotSerializableException.

Ответ 8

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

Ответ на этот вопрос - это определенные классы системного уровня, такие как Thread, OutputStream и его подклассы, которые не являются сериализуемыми. Очень хорошо объяснили документы оракула: http://www.oracle.com/technetwork/articles/java/javaserial-1536170.html

Ниже представлен реферат:

С другой стороны, некоторые классы системного уровня, такие как Thread, OutputStream и его подклассы, и Socket не являются сериализуемыми. В самом деле, это не имело бы смысла, если бы они были. Например, поток, запущенный в моей JVM, будет использовать мою системную память. Сохранение этого и попытка запустить его в вашей JVM не имеет никакого смысла.

Ответ 9

Более практично, ни один объект не может быть сериализован (через встроенный Java механизм), если его класс не реализует интерфейс Serializable. Быть примером такого класса не является достаточным условием, однако: для того, чтобы объект был успешно сериализован, он также должен быть true, что все непереходные ссылки, которые он имеет, должны быть нулевыми или ссылаться на сериализуемые объекты. (Имейте в виду, что это рекурсивное условие.) Примитивные значения, нули и переходные переменные не являются проблемой. Статические переменные не относятся к отдельным объектам, поэтому они не также представляет проблему.

Некоторые общие классы надежно сериализуемы. Строки вероятно, наиболее заметным здесь, но все классы-оболочки для примитивных типы также безопасны. Массивы примитивов надежно сериализуемы. Массивы ссылочных типов могут быть сериализованы, если все их элементы могут быть сериализованная.

Ответ 10

Какие данные могут вызвать исключение NotSerializableException?

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

Интерфейс Serializable - это просто маркер-интерфейс, так что мы можем сказать, что это просто штамп на классе и который просто говорит JVM, что класс можно сериализовать.

Откуда мне знать, что я не должен добавлять предложение Serializable для моего класса?

Все зависит от ваших потребностей.

  1. Если вы хотите сохранить объект в базе данных, вы можете сериализовать его в последовательность байтов и сохранить в базе данных как постоянные данные.

  2. Вы можете сериализовать свой Объект для использования другой JVM, работающей на другом компьютере.