Класс ObjectInputStream

Все реализуемые интерфейсы:
Closeable, DataInput, ObjectInput, ObjectStreamConstants, AutoCloseable
public class ObjectInputStream
extends InputStream
implements ObjectInput, ObjectStreamConstants

Класс ObjectInputStream десериализует примитивные данные и объекты, предварительно записанные с помощью ObjectOutputStream.

Предупреждение: Десериализация недоверенных данных изначально небезопасна и должна быть избегаема. Недоверенные данные должны быть тщательно валидированы в соответствии с разделом «Сериализация и десериализация» Рекомендаций по защищенному программированию для Java SE. Фильтрация сериализации описывает лучшие практики для защищенного использования фильтров сериализации.

ObjectOutputStream и ObjectInputStream могут предоставить приложению устойчивое хранилище графов объектов при использовании с FileOutputStream и FileInputStream соответственно. ObjectInputStream используется для восстановления этих ранее сериализованных объектов. Другие применения включают передачу объектов между хостами с помощью потока сокета или для маршаллирования и размаршаллирования аргументов и параметров в системе удалённой коммуникации.

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

Из потоков можно считывать только объекты, поддерживающие интерфейсы java.io.Serializable или java.io.Externalizable.

Метод readObject используется для чтения объекта из потока. Для получения желаемого типа следует использовать безопасное приведение Java. В Java строки и массивы являются объектами и обрабатываются как объекты во время сериализации. При чтении их необходимо приводить к ожидаемому типу.

Примитивные типы данных можно считывать из потока, используя соответствующий метод в DataInput.

По умолчанию механизм десериализации объектов восстанавливает содержимое каждого поля до значения и типа, которые оно имело при записи. Поля, объявленные как transient или static, игнорируются процессом десериализации. Ссылки на другие объекты приводят к чтению этих объектов из потока по мере необходимости. Графы объектов восстанавливаются правильно с использованием механизма совместного использования ссылок. При десериализации всегда выделяются новые объекты, что предотвращает перезапись существующих объектов.

Чтение объекта аналогично выполнению конструкторов нового объекта. Память выделяется для объекта и инициализируется нулём. Для несериализуемых классов вызывается конструктор без аргументов, а затем поля сериализуемых классов восстанавливаются из потока, начиная с сериализуемого класса, ближайшего к java.lang.object, и заканчивая самым специфичным классом объекта.

Например, для чтения из потока, как записано в примере в ObjectOutputStream:

FileInputStream fis = new FileInputStream("t.tmp");
      ObjectInputStream ois = new ObjectInputStream(fis);

      int i = ois.readInt();
      String today = (String) ois.readObject();
      Date date = (Date) ois.readObject();

      ois.close();

Классы контролируют, как они сериализуются, реализуя либо интерфейсы java.io.Serializable, либо java.io.Externalizable.

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

Сериализуемые классы, требующие специальной обработки во время сериализации и десериализации, должны реализовать следующие методы:

private void writeObject(java.io.ObjectOutputStream stream)
     throws IOException;
 private void readObject(java.io.ObjectInputStream stream)
     throws IOException, ClassNotFoundException;
 private void readObjectNoData()
     throws ObjectStreamException;

Метод readObject отвечает за чтение и восстановление состояния объекта для его конкретного класса с использованием данных, записанных в поток соответствующим методом writeObject. Методу не нужно беспокоиться о состоянии, принадлежащем его суперклассам или подклассам. Состояние восстанавливается путём чтения данных из ObjectInputStream для отдельных полей и присваивания соответствующих полей объекта.

Чтение примитивных типов данных поддерживается DataInput.

Любая попытка чтения данных объекта, которые выходят за пределы границ пользовательских данных, записанных соответствующим методом writeObject, вызовет исключение OptionalDataException со значением eof, равным true. Чтение, не связанное с объектом, которое выходит за пределы выделенных данных, отразит конец данных аналогично тому, как они указывали бы на конец потока: чтение байт возвратит -1 в качестве прочитанного байта или количества прочитанных байтов, а чтение примитивных типов вызовет EOFExceptions. Если нет соответствующего метода writeObject, конец стандартных сериализованных данных отмечает конец выделенных данных.

Вызовы чтения примитивных и объектных типов данных, выпущенные внутри метода readExternal, ведут себя одинаково - если поток уже находится в конце данных, записанных соответствующим методом writeExternal, чтение объектов вызовет OptionalDataExceptions со значением eof, равным true, чтение байтов вернёт -1, а чтение примитивных типов вызовет EOFExceptions. Обратите внимание, что это поведение не сохраняется для потоков, записанных со старым ObjectStreamConstants.PROTOCOL_VERSION_1 протоколом, в котором конец данных, записанных методами writeExternal, не размечается и, следовательно, не может быть обнаружен.

Метод readObjectNoData отвечает за инициализацию состояния объекта для его конкретного класса в случае, если поток сериализации не указывает данный класс как суперкласс десериализуемого объекта. Это может произойти в тех случаях, когда принимающая сторона использует другую версию класса десериализованного экземпляра, чем отправляющая сторона, и версия получателя расширяет классы, которые не расширяются версией отправителя. Это также может произойти, если поток сериализации был изменён, поэтому readObjectNoData полезен для правильной инициализации десериализованных объектов несмотря на "враждебный" или неполный исходный поток.

Сериализация не читает и не присваивает значения полям любого объекта, не реализующего интерфейс java.io.Serializable. Подклассы объектов, которые не являются сериализуемыми, могут быть сериализуемыми. В этом случае несериализуемый класс должен иметь конструктор без аргументов, чтобы позволить инициализацию его полей. В этом случае подкласс отвечает за сохранение и восстановление состояния несериализуемого класса. Часто поля этого класса являются доступными (public, package или protected) или существуют методы get и set, которые могут быть использованы для восстановления состояния.

Содержимое потока может быть отфильтровано во время десериализации. Если для ObjectInputStream установлен фильтр (установлен фильтр), ObjectInputFilter может проверить, разрешены ли классы, длины массивов, количество ссылок в потоке, глубина и количество байтов, потребленных из входного потока, и в противном случае может прервать десериализацию. Можно настроить фильтр, применяемый ко всем ObjectInputStream на весь процесс, если он не заменён с помощью (setObjectInputFilter).

Любое исключение, возникающее во время десериализации объекта, будет перехвачено ObjectInputStream и прервёт процесс чтения.

Реализация интерфейса Externalizable позволяет объекту полностью контролировать содержимое и формат сериализованной формы объекта. Методы интерфейса Externalizable, writeExternal и readExternal, вызываются для сохранения и восстановления состояния объектов. При реализации классом они могут записывать и читать собственное состояние, используя все методы ObjectOutput и ObjectInput. Ответственность за обработку любой версии лежит на объектах.

Константы перечислений десериализуются иначе, чем обычные сериализуемые или внешние объекты. Сериализованная форма константы перечисления состоит только из ее имени; значения полей константы не передаются. Для десериализации константы перечисления ObjectInputStream считывает имя константы из потока; десериализованная константа затем получается путем вызова статического метода Enum.valueOf(Class, String) с базовым типом константы перечисления и полученным именем константы в качестве аргументов. Как и другие сериализуемые или внешние объекты, константы перечислений могут служить целями обратных ссылок, появляющихся впоследствии в потоке сериализации. Процесс десериализации констант перечисления не может быть настроен: любые методы readObject, readObjectNoData и readResolve, определённые для типов перечислений, игнорируются во время десериализации. Аналогично, любые объявления полей serialPersistentFields или serialVersionUID также игнорируются - все типы перечислений имеют фиксированную serialVersionUID 0L.

С момента:
1.1
См. также:
DataInput, ObjectOutputStream, Serializable, Спецификация сериализации объектов, раздел 3, Классы входного объекта

Вложенные классы

Модификатор и тип Класс Описание
static class  ObjectInputStream.GetField

Предоставляет доступ к постоянным полям, считанным из входного потока.

Поля

Поля, объявленные в интерфейсе java.io.ObjectStreamConstants

baseWireHandle, PROTOCOL_VERSION_1, PROTOCOL_VERSION_2, SC_BLOCK_DATA, SC_ENUM, SC_EXTERNALIZABLE, SC_SERIALIZABLE, SC_WRITE_METHOD, SERIAL_FILTER_PERMISSION, STREAM_MAGIC, STREAM_VERSION, SUBCLASS_IMPLEMENTATION_PERMISSION, SUBSTITUTION_PERMISSION, TC_ARRAY, TC_BASE, TC_BLOCKDATA, TC_BLOCKDATALONG, TC_CLASS, TC_CLASSDESC, TC_ENDBLOCKDATA, TC_ENUM, TC_EXCEPTION, TC_LONGSTRING, TC_MAX, TC_NULL, TC_OBJECT, TC_PROXYCLASSDESC, TC_REFERENCE, TC_RESET, TC_STRING

Конструкторы

Модификатор Конструктор Описание
protected ObjectInputStream()

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

ObjectInputStream​(InputStream in)

Создаёт ObjectInputStream, который читает из указанного InputStream.

Методы

Модификатор и тип Метод Описание
int available()

Возвращает количество байтов, которые можно прочитать без блокировки.

void close()

Закрывает входной поток.

void defaultReadObject()

Читает нестатические и нетранзиентные поля текущего класса из этого потока.

protected boolean enableResolveObject​(boolean enable)

Разрешает потоку выполнять замену объектов, считанных из потока.

ObjectInputFilter getObjectInputFilter()

Возвращает фильтр сериализации для этого потока.

int read()

Читает байт данных.

int read​(byte[] buf, int off, int len)

Читает в массив байтов.

boolean readBoolean()

Читает булево значение.

byte readByte()

Читает байт 8-битный байт.

char readChar()

Читает 16-битный символ.

protected ObjectStreamClass readClassDescriptor()

Читает описание класса из потока сериализации.

double readDouble()

Читает 64-битное число с плавающей точкой.

ObjectInputStream.GetField readFields()

Читает постоянные поля из потока и делает их доступными по имени.

float readFloat()

Читает 32-битное число с плавающей точкой.

void readFully​(byte[] buf)

Читает байты, блокируя до тех пор, пока не будут прочитаны все байты.

void readFully​(byte[] buf, int off, int len)

Читает байты, блокируя до тех пор, пока не будут прочитаны все байты.

int readInt()

Читает 32-битное целое число.

String readLine()

Устаревший.

Этот метод не правильно преобразует байты в символы.

long readLong()

Читает 64-битное целое число.

Object readObject()

Читает объект из ObjectInputStream.

protected Object readObjectOverride()

Этот метод вызывается доверенными подклассами ObjectOutputStream, которые создали ObjectOutputStream с использованием защищенного конструктора без аргументов.

short readShort()

Читает 16-битное короткое целое число.

protected void readStreamHeader()

Метод readStreamHeader предоставлен для того, чтобы подклассы могли читать и проверять собственные заголовки потоков.

Object readUnshared()

Читает "несовместный" объект из ObjectInputStream.

int readUnsignedByte()

Читает 8-битный байт без знака.

int readUnsignedShort()

Читает 16-битное короткое целое число без знака.

String readUTF()

Читает строку в формате модифицированного UTF-8.

void registerValidation​(ObjectInputValidation obj, int prio)

Регистрирует объект для проверки перед возвратом графа.

protected Class<?> resolveClass​(ObjectStreamClass desc)

Загружает локальный эквивалент класса для указанного описания класса потока.

protected Object resolveObject​(Object obj)

Этот метод позволит доверенным подклассам ObjectInputStream подставить один объект вместо другого во время десериализации.

protected Class<?> resolveProxyClass​(String[] interfaces)

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

void setObjectInputFilter​(ObjectInputFilter filter)

Устанавливает фильтр сериализации для потока.

int skipBytes​(int len)

Пропускает байты.

Методы, объявленные в классе java.io.InputStream

mark, markSupported, nullInputStream, read, readAllBytes, readNBytes, readNBytes, reset, skip, transferTo

Методы, объявленные в классе java.lang.Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

Методы, объявленные в интерфейсе java.io.ObjectInput

read, skip

Конструкторы

ObjectInputStream

public ObjectInputStream(InputStream in)
                  throws IOException

Создает ObjectInputStream, который читает из указанного InputStream. Заголовок потока сериализации читается из потока и проверяется. Этот конструктор будет заблокирован до тех пор, пока соответствующий ObjectOutputStream не запишет и не осуществит сброс заголовка.

Фильтр сериализации инициализируется значением фильтра процесса.

Если установлен менеджер безопасности, этот конструктор проверит наличие "enableSubclassImplementation" SerializablePermission при вызове напрямую или косвенно конструктором подкласса, который переопределяет методы ObjectInputStream.readFields или ObjectInputStream.readUnshared.

Параметры:
in - входной поток для чтения
Исключения:
StreamCorruptedException - если заголовок потока неверный
IOException - если произошла ошибка ввода/вывода при чтении заголовка потока
SecurityException - если недоверенный подкласс незаконно переопределяет методы, чувствительные к безопасности
NullPointerException - если in является null
См. также:
ObjectInputStream(), readFields(), ObjectOutputStream(OutputStream)

ObjectInputStream

protected ObjectInputStream()
                     throws IOException,
                            SecurityException

Предоставляет способ для подклассов, полностью переопределяющих ObjectInputStream, не выделять приватные данные, используемые только этой реализацией ObjectInputStream.

Фильтр сериализации инициализируется значением фильтра процесса.

Если менеджер безопасности установлен, этот метод сначала вызывает метод менеджера безопасности checkPermission с разрешением SerializablePermission("enableSubclassImplementation"), чтобы убедиться, что разрешено включение подклассов.

Исключения:
SecurityException - если менеджер безопасности существует и его метод checkPermission запрещает включение подклассов.
IOException - если произошла ошибка ввода/вывода при создании этого потока
См. также:
SecurityManager.checkPermission(java.security.Permission), SerializablePermission

Методы

readObject

public final Object readObject()
                        throws IOException,
                               ClassNotFoundException

Считывает объект из потока ObjectInputStream. Считываются класс объекта, сигнатура класса и значения не-транзиентных и не-статических полей класса и всех его супертипов. По умолчанию десериализацию для класса можно переопределить с помощью методов writeObject и readObject. Объекты, на которые ссылается этот объект, считываются транзитивно, чтобы была реконструирована полная эквивалентная графа объектов методом readObject.

Корневой объект полностью восстанавливается, когда все его поля и объекты, на которые он ссылается, полностью восстановлены. В этот момент вызываются коллбеки проверки объекта в порядке, определённом по их зарегистрированным приоритетам. Колбэки регистрируются объектами (в специальных методах readObject) по мере их индивидуального восстановления.

Фильтр сериализации, если он не null, вызывается для каждого считанного объекта (обычного или класса) для реконструкции корневого объекта. Подробнее см. setObjectInputFilter.

Исключения генерируются при проблемах с потоком InputStream и для классов, которые не должны быть десериализованы. Все исключения являются фатальными для InputStream и оставляют его в неопределенном состоянии; вызывающая сторона должна игнорировать или восстанавливать состояние потока.

Определено в:
readObject в интерфейсе ObjectInput
Возвращает:
объект, прочитанный из потока
Бросает:
ClassNotFoundException - Класс сериализованного объекта не найден.
InvalidClassException - Проблема с классом, используемым сериализацией.
StreamCorruptedException - Несоответствие контрольной информации в потоке.
OptionalDataException - В потоке обнаружены примитивные данные вместо объектов.
IOException - Любые обычные исключения, связанные со вводом/выводом.

readObjectOverride

protected Object readObjectOverride()
                             throws IOException,
                                    ClassNotFoundException

Этот метод вызывается доверенными подклассами ObjectOutputStream, которые построены с использованием защищенного конструктора без аргументов ObjectOutputStream. Ожидается, что подкласс предоставит метод переопределения с модификатором "final".

Возвращает:
объект, прочитанный из потока.
Бросает:
ClassNotFoundException - Определение класса сериализованного объекта не найдено.
OptionalDataException - В потоке обнаружены примитивные данные вместо объектов.
IOException - если при чтении из базового потока произошли ошибки ввода/вывода
С:
1.2
См. также:
ObjectInputStream(), readObject()

readUnshared

public Object readUnshared()
                    throws IOException,
                           ClassNotFoundException

Считывает "необщий" объект из ObjectInputStream. Этот метод идентичен readObject, за исключением того, что он предотвращает последующие вызовы readObject и readUnshared от возврата дополнительных ссылок на десериализованный экземпляр, полученный через этот вызов. Конкретно:

  • Если readUnshared вызывается для десериализации обратной ссылки (представление в потоке объекта, который был ранее записан в поток), будет брошено исключение ObjectStreamException.
  • Если readUnshared успешно возвращает значение, то любые последующие попытки десериализовать обратные ссылки на обработчик потока, десериализованный readUnshared, приведут к возбуждению исключения ObjectStreamException.
Десериализация объекта через readUnshared делает недействительной обработку потока, связанную с возвращенным объектом. Обратите внимание, что это само по себе не всегда гарантирует, что возвращенная ссылка readUnshared уникальна; десериализованный объект может определить метод readResolve, который возвращает видимый для других сторон объект, или readUnshared может вернуть объект Class или константу перечисления, доступную где-либо еще в потоке или через внешние средства. Если десериализованный объект определяет метод readResolve, и вызов этого метода возвращает массив, то readUnshared возвращает неглубокую копию этого массива; это гарантирует, что возвращенный объект массива уникален и не может быть получен второй раз вызовом readObject или readUnshared на ObjectInputStream, даже если базовый поток данных был изменен.

Фильтр сериализации, если он не null, вызывается для каждого считанного объекта (обычного или класса) для реконструкции корневого объекта. Подробнее см. setObjectInputFilter.

Подклассы ObjectInputStream, которые переопределяют этот метод, могут быть созданы только в контекстах безопасности, обладающих разрешением SerializablePermission "enableSubclassImplementation"; любая попытка создать такой подкласс без этого разрешения вызовет исключение SecurityException.

Возвращает:
ссылка на десериализованный объект
Бросает:
ClassNotFoundException - если класс объекта для десериализации не найден
StreamCorruptedException - если контрольная информация в потоке несогласованная
ObjectStreamException - если объект для десериализации уже появился в потоке
OptionalDataException - если в потоке следуют примитивные данные
IOException - если во время десериализации произошла ошибка ввода/вывода
С:
1.4

defaultReadObject

public void defaultReadObject()
                       throws IOException,
                              ClassNotFoundException

Считывает нестатические и не-транзиентные поля текущего класса из этого потока. Этот метод можно вызывать только из метода readObject класса, который десериализуется. Он бросит NotActiveException, если вызван в другом случае.

Бросает:
ClassNotFoundException - если класс сериализованного объекта не найден.
IOException - если произошла ошибка ввода/вывода.
NotActiveException - если поток в данный момент не считывает объекты.

readFields

public ObjectInputStream.GetField readFields()
                                      throws IOException,
                                             ClassNotFoundException

Считывает персистентные поля из потока и делает их доступными по имени.

Возвращает:
объект GetField, представляющий персистентные поля десериализуемого объекта
Бросает:
ClassNotFoundException - если класс сериализованного объекта не найден.
IOException - если произошла ошибка ввода/вывода.
NotActiveException - если поток в данный момент не считывает объекты.
С:
1.2

registerValidation

public void registerValidation(ObjectInputValidation obj,
                               int prio)
                        throws NotActiveException,
                               InvalidObjectException

Регистрирует объект для валидации перед возвратом графа. Хотя подобно resolveObject, эти проверки вызываются после того, как вся графа была реконструирована. Как правило, метод readObject зарегистрирует объект в потоке, чтобы при восстановлении всех объектов можно было выполнить окончательный набор проверок.

Параметры:
obj - объект, который получит обратный вызов валидации.
prio - управляет порядком обратных вызовов; ноль — хорошее значение по умолчанию. Используйте большие значения, чтобы обратный вызов произошёл раньше, меньшие значения — позже. В пределах приоритета обратные вызовы обрабатываются без определённого порядка.
Бросает:
NotActiveException - Поток в данный момент не считывает объекты, поэтому регистрация обратного вызова недопустима.
InvalidObjectException - Объект валидации равен null.

resolveClass

protected Class<?> resolveClass(ObjectStreamClass desc)
                         throws IOException,
                                ClassNotFoundException

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

Соответствующий метод в ObjectOutputStream — это annotateClass. Этот метод будет вызван только один раз для каждого уникального класса в потоке. Этот метод может быть реализован подклассами для использования альтернативного механизма загрузки, но должен возвращать объект Class. После возврата, если класс не является классом массива, его serialVersionUID сравнивается с serialVersionUID сериализованного класса, и если обнаружено несоответствие, десериализация завершается неудачей, и выбрасывается InvalidClassException.

Реализация по умолчанию этого метода в ObjectInputStream возвращает результат вызова

Class.forName(desc.getName(), false, loader)
, где loader — первый загрузчик классов в стеке текущей нити (начиная с выполняемого метода), который не является платформенным загрузчиком классов и не является его предком; в противном случае loader — это платформенный загрузчик классов. Если этот вызов возвращает ClassNotFoundException и имя переданного объекта ObjectStreamClass является ключевым словом Java-языка для примитивного типа или void, то возвращается объект Class, представляющий этот примитивный тип или void (например, объект ObjectStreamClass с именем "int" будет разрешен до Integer.TYPE). В противном случае вызывающему методу будет брошено исключение ClassNotFoundException.
Параметры:
desc - экземпляр класса ObjectStreamClass
Возвращает:
объект Class , соответствующий desc
Бросает:
IOException - любые обычные исключения ввода/вывода.
ClassNotFoundException - если класс сериализованного объекта не найден.

resolveProxyClass

protected Class<?> resolveProxyClass(String[] interfaces)
                              throws IOException,
                                     ClassNotFoundException

Возвращает класс-прокси, который реализует интерфейсы, указанные в описателе класса-прокси; подклассы могут переопределить этот метод для чтения пользовательских данных из потока вместе с описателями для динамических классов-прокси, что позволяет им использовать альтернативный механизм загрузки для интерфейсов и класса-прокси.

Этот метод вызывается ровно один раз для каждого уникального описателя класса-прокси в потоке.

Соответствующий метод в ObjectOutputStream является annotateProxyClass. Для данного подкласса ObjectInputStream, который переопределяет этот метод, метод annotateProxyClass в соответствующем подклассе ObjectOutputStream должен записать любые данные или объекты, прочитанные этим методом.

Стандартная реализация этого метода в ObjectInputStream возвращает результат вызова Proxy.getProxyClass со списком Class объектов для интерфейсов, указанных в параметре interfaces. Объект Class для каждого имени интерфейса i — это значение, возвращаемое при вызове

Class.forName(i, false, loader)
где loader — первый загрузчик классов в стеке текущей нити (начиная с текущего выполняемого метода), который не является платформенным загрузчиком классов и не является его предком; в противном случае loader — это платформенный загрузчик классов. Если ни один из разрешенных интерфейсов не является общедоступным, это же значение loader также является загрузчиком классов, переданным в Proxy.getProxyClass; если присутствуют не общедоступные интерфейсы, вместо него передается их загрузчик классов (если встречается более одного загрузчика классов не общедоступных интерфейсов, выбрасывается IllegalAccessError). Если Proxy.getProxyClass выбрасывает исключение IllegalArgumentException, resolveProxyClass выбросит исключение ClassNotFoundException, содержащее IllegalArgumentException.
Параметры:
interfaces - список имён интерфейсов, десериализованных в описателе класса-прокси
Возвращает:
класс-прокси для указанных интерфейсов
Исключение:
IOException - любое исключение, выброшенное базовым InputStream
ClassNotFoundException - если класс-прокси или любой из указанных интерфейсов не найден
С момента:
1.3
См. также:
ObjectOutputStream.annotateProxyClass(Class)

resolveObject

protected Object resolveObject(Object obj)
                        throws IOException

Этот метод позволит надёжным подклассам ObjectInputStream подставлять один объект на другой во время десериализации. Замена объектов отключается до вызова enableResolveObject. Метод enableResolveObject проверяет, можно ли доверять потоку, запрашивающему разрешение на замену объекта. Каждая ссылка на сериализуемые объекты передаётся в resolveObject. Чтобы гарантировать, что частное состояние объектов не будет непреднамеренно раскрыто, только надёжные потоки могут использовать resolveObject.

Этот метод вызывается после того, как объект был прочитан, но перед тем, как он возвращается из readObject. Стандартный метод resolveObject просто возвращает тот же объект.

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

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

Параметры:
obj - подставляемый объект
Возвращает:
подставленный объект
Исключение:
IOException - Любое из обычных исключений ввода/вывода.

enableResolveObject

protected boolean enableResolveObject(boolean enable)
                               throws SecurityException

Включает возможность потоку выполнять замену объектов, считанных из потока. При включении, метод resolveObject(java.lang.Object) вызывается для каждого десериализуемого объекта.

Если замена объекта в данный момент отключена, и enable равно true, и установлено менеджер безопасности, этот метод сначала вызывает метод checkPermission менеджера безопасности с разрешением SerializablePermission("enableSubstitution"), чтобы убедиться, что у вызывающего есть разрешение на включение возможности потока по замене считываемых объектов.

Параметры:
enable - true для включения использования resolveObject для каждого десериализуемого объекта
Возвращает:
предыдущее значение до вызова этого метода
Исключение:
SecurityException - если менеджер безопасности существует и его метод checkPermission запрещает включение возможности потока по замене считываемых объектов.
См. также:
SecurityManager.checkPermission(java.security.Permission), SerializablePermission

readStreamHeader

protected void readStreamHeader()
                         throws IOException,
                                StreamCorruptedException

Метод readStreamHeader предназначен для того, чтобы подклассы могли читать и проверять собственные заголовки потоков. Он считывает и проверяет магическое число и номер версии.

Исключение:
IOException - если при чтении из базового InputStream произошли ошибки ввода/вывода
StreamCorruptedException - если управляющая информация в потоке не соответствует требованиям

readClassDescriptor

protected ObjectStreamClass readClassDescriptor()
                                         throws IOException,
                                                ClassNotFoundException

Чтение описателя класса из потока сериализации. Этот метод вызывается, когда ObjectInputStream ожидает описателя класса как следующего элемента в потоке сериализации. Подклассы ObjectInputStream могут переопределить этот метод, чтобы читать описатели классов, которые были записаны в нестандартных форматах (подклассами ObjectOutputStream, которые переопределили метод writeClassDescriptor). По умолчанию этот метод читает описатели классов в соответствии с форматом, определённым в спецификации сериализации объектов.

Возвращает:
прочитанный описатель класса
Исключение:
IOException - Если произошла ошибка ввода/вывода.
ClassNotFoundException - Если класс сериализованного объекта, используемого в представлении описателя класса, не найден
С момента:
1.3
См. также:
ObjectOutputStream.writeClassDescriptor(java.io.ObjectStreamClass)

read

public int read()
         throws IOException

Читает байт данных. Этот метод будет блокироваться, если доступ к вводу недоступен.

Определено в:
read в интерфейсе ObjectInput
Определено в:
read в классе InputStream
Возвращает:
прочитанный байт или -1, если достигнут конец потока.
Исключение:
IOException - Если произошла ошибка ввода/вывода.

read

public int read(byte[] buf,
                int off,
                int len)
         throws IOException

Читает в массив байтов. Этот метод будет блокироваться, пока доступен некоторый ввод. Рассмотрите использование java.io.DataInputStream.readFully для чтения ровно 'length' байтов.

Определено в:
read в интерфейсе ObjectInput
Переопределяет:
read в классе InputStream
Параметры:
buf - буфер, в который читаются данные
off - начальный смещение в целевом массиве buf
len - максимальное количество читаемых байтов
Возвращает:
фактическое количество прочитанных байтов, -1 возвращается, когда достигнут конец потока.
Исключение:
NullPointerException - если buf равно null.
IndexOutOfBoundsException - если off отрицательно, len отрицательно или len больше, чем buf.length - off.
IOException - Если произошла ошибка ввода/вывода.
См. также:
DataInputStream.readFully(byte[],int,int)

available

public int available()
              throws IOException

Возвращает количество байтов, которые могут быть прочитаны без блокировки.

Определено в:
available в интерфейсе ObjectInput
Переопределяет:
available в классе InputStream
Возвращает:
количество доступных байтов.
Исключение:
IOException - если при чтении из базового InputStream произошли ошибки ввода/вывода

close

public void close()
           throws IOException

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

Определено в:
close в интерфейсе AutoCloseable
Определено в:
close в интерфейсе Closeable
Определено в:
close в интерфейсе ObjectInput
Переопределяет:
close в классе InputStream
Исключение:
IOException - Если произошла ошибка ввода/вывода.

readBoolean

public boolean readBoolean()
                    throws IOException

Читает булево значение.

Определено в:
readBoolean в интерфейсе DataInput
Возвращает:
прочитанное булево значение.
Исключение:
EOFException - Если достигнут конец файла.
IOException - Если произошла другая ошибка ввода/вывода.

readByte

public byte readByte()
              throws IOException

Читает байт 8-битного целого числа.

Определено в:
readByte в интерфейсе DataInput
Возвращает:
прочитанный байт 8-битного целого числа.
Исключение:
EOFException - Если достигнут конец файла.
IOException - Если произошла другая ошибка ввода/вывода.

readUnsignedByte

public int readUnsignedByte()
                     throws IOException

Читает беззнаковое 8-битное целое число.

Определено в:
readUnsignedByte в интерфейсе DataInput
Возвращает:
прочитанный байт 8-битного целого числа.
Исключение:
EOFException - Если достигнут конец файла.
IOException - Если произошла другая ошибка ввода/вывода.

readChar

public char readChar()
              throws IOException

Читает 16-битное символьное значение.

Определено в:
readChar в интерфейсе DataInput
Возвращает:
прочитанный символ 16-битного целого числа.
Исключение:
EOFException - Если достигнут конец файла.
IOException - Если произошла другая ошибка ввода/вывода.

readShort

public short readShort()
                throws IOException

Читает 16-битное целое число типа short.

Указано в:
readShort в интерфейсе DataInput
Возвращает:
короткое целое 16 бит.
Выбрасывает:
EOFException - Если достигнут конец файла.
IOException - Если произошла другая ошибка ввода-вывода.

readUnsignedShort

public int readUnsignedShort()
                      throws IOException

Читает беззнаковое короткое целое 16 бит.

Указано в:
readUnsignedShort в интерфейсе DataInput
Возвращает:
короткое целое 16 бит.
Выбрасывает:
EOFException - Если достигнут конец файла.
IOException - Если произошла другая ошибка ввода-вывода.

readInt

public int readInt()
            throws IOException

Читает целое 32 бит.

Указано в:
readInt в интерфейсе DataInput
Возвращает:
целое 32 бит.
Выбрасывает:
EOFException - Если достигнут конец файла.
IOException - Если произошла другая ошибка ввода-вывода.

readLong

public long readLong()
              throws IOException

Читает целое 64 бит.

Указано в:
readLong в интерфейсе DataInput
Возвращает:
целое 64 бит.
Выбрасывает:
EOFException - Если достигнут конец файла.
IOException - Если произошла другая ошибка ввода-вывода.

readFloat

public float readFloat()
                throws IOException

Читает число с плавающей точкой 32 бит.

Указано в:
readFloat в интерфейсе DataInput
Возвращает:
число с плавающей точкой 32 бит.
Выбрасывает:
EOFException - Если достигнут конец файла.
IOException - Если произошла другая ошибка ввода-вывода.

readDouble

public double readDouble()
                  throws IOException

Читает число с плавающей точкой 64 бит.

Указано в:
readDouble в интерфейсе DataInput
Возвращает:
число с плавающей точкой 64 бит.
Выбрасывает:
EOFException - Если достигнут конец файла.
IOException - Если произошла другая ошибка ввода-вывода.

readFully

public void readFully(byte[] buf)
               throws IOException

Читает байты, блокируя до тех пор, пока все байты не будут прочитаны.

Указано в:
readFully в интерфейсе DataInput
Параметры:
buf - буфер, в который считываются данные
Выбрасывает:
NullPointerException - Если buf равен null.
EOFException - Если достигнут конец файла.
IOException - Если произошла другая ошибка ввода-вывода.

readFully

public void readFully(byte[] buf,
                      int off,
                      int len)
               throws IOException

Читает байты, блокируя до тех пор, пока все байты не будут прочитаны.

Указано в:
readFully в интерфейсе DataInput
Параметры:
buf - буфер, в который считываются данные
off - начальный смещение в массиве данных buf
len - максимальное количество байтов для чтения
Выбрасывает:
NullPointerException - Если buf равен null.
IndexOutOfBoundsException - Если off отрицателен, len отрицателен или len больше buf.length - off.
EOFException - Если достигнут конец файла.
IOException - Если произошла другая ошибка ввода-вывода.

skipBytes

public int skipBytes(int len)
              throws IOException

Пропускает байты.

Указано в:
skipBytes в интерфейсе DataInput
Параметры:
len - количество байтов, которые нужно пропустить
Возвращает:
фактическое количество пропущенных байтов.
Выбрасывает:
IOException - Если произошла ошибка ввода-вывода.

readLine

@Deprecated
public String readLine()
                throws IOException
Устарело.
Этот метод не правильно преобразует байты в символы. Смотрите DataInputStream для подробностей и альтернатив.

Читает строку, завершенную \n, \r, \r\n или EOF.

Указано в:
readLine в интерфейсе DataInput
Возвращает:
строку.
Выбрасывает:
IOException - если при чтении из базового InputStream произошли ошибки ввода-вывода

readUTF

public String readUTF()
               throws IOException

Читает строку в формате изменённый UTF-8.

Указано в:
readUTF в интерфейсе DataInput
Возвращает:
строку.
Выбрасывает:
IOException - если при чтении из базового InputStream произошли ошибки ввода-вывода
UTFDataFormatException - если прочитанные байты не представляют собой действительного кодирования строки в формате изменённый UTF-8

getObjectInputFilter

public final ObjectInputFilter getObjectInputFilter()

Возвращает фильтр сериализации для этого потока. Фильтр сериализации — это последний фильтр, установленный в setObjectInputFilter или начальный фильтр для всего процесса из ObjectInputFilter.Config.getSerialFilter.

Возвращает:
фильтр сериализации для потока; может быть null
С:
9

setObjectInputFilter

public final void setObjectInputFilter(ObjectInputFilter filter)

Устанавливает фильтр сериализации для потока. Метод checkInput фильтра вызывается для каждого класса и ссылки в потоке. Фильтр может проверять любой или все из класса, длины массива, числа ссылок, глубины графа и размера входного потока. Глубина — это количество вложенных вызовов readObject, начиная с чтения корня десериализуемого графа и текущего десериализуемого объекта. Число ссылок — это совокупное число объектов и ссылок на объекты, уже прочитанные из потока, включая текущий считываемый объект. Фильтр вызывается только при чтении объектов из потока и не для примитивов.

Если фильтр возвращает Status.REJECTED, null или выбрасывает RuntimeException, активный readObject или readUnshared выбрасывает InvalidClassException, в противном случае десериализация продолжается без перерыва.

Фильтр сериализации инициализируется значением ObjectInputFilter.Config.getSerialFilter при создании ObjectInputStream и может быть установлен в пользовательский фильтр только один раз.

Требования к реализации:
Фильтр, когда не null, вызывается во время readObject и readUnshared для каждого объекта (обычного или класса) в потоке. Строки обрабатываются как примитивы и не вызывают фильтр. Фильтр вызывается для:
  • каждой ссылки на объект, предварительно десериализованный из потока (класс null, arrayLength — -1),
  • каждого обычного класса (класс не null, arrayLength — -1),
  • каждого интерфейса динамического прокси и самого динамического класса прокси (класс не null, arrayLength — -1),
  • каждого массива, отфильтрованного по типу и длине массива (класс — тип массива, arrayLength — запрашиваемая длина),
  • каждого объекта, заменённого методом readResolve класса, если он не null, и если это массив, arrayLength, иначе -1,
  • и каждого объекта, заменённого resolveObject, отфильтрованного по классу заменяющего объекта, если он не null, и если это массив, arrayLength, иначе -1.
Когда метод checkInput вызывается, у него есть доступ к текущему классу, длине массива, текущему количеству ссылок, уже прочитанных из потока, глубине вложенных вызовов readObject или readUnshared, и реализуемой зависимости от количества байтов, потребленных из входного потока.

Каждый вызов readObject или readUnshared увеличивает глубину на 1 перед чтением объекта и уменьшает на 1 перед нормальным или исключительным возвращением. Глубина начинается с 1 и увеличивается для каждого вложенного объекта и уменьшается, когда каждый вложенный вызов возвращает значение. Счётчик ссылок в потоке начинается с 1 и увеличивается перед чтением объекта.

Параметры:
filter - фильтр, может быть null
Выбрасывает:
SecurityException - если есть менеджер безопасности и SerializablePermission("serialFilter") не предоставлены
IllegalStateException - если текущий фильтр не null и не фильтр всего процесса
С:
9

© 1993, 2020, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/io/ObjectInputStream.html

Spec-Zone .ru
спецификации, руководства, описания, API