Spec-Zone.ru › OpenJDK 17

Класс ObjectInputStream

java.lang.Object
java.io.InputStream
java.io.ObjectInputStream
Все реализованные интерфейсы:
Closeable, DataInput, ObjectInput, ObjectStreamConstants, AutoCloseable
public class ObjectInputStream extends InputStream implements ObjectInput, ObjectStreamConstants
Класс ObjectInputStream предназначен для десериализации примитивных данных и объектов, ранее записанных с помощью ObjectOutputStream.

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

Ключ к предотвращению атак на десериализацию заключается в предотвращении десериализации экземпляров произвольных классов, тем самым предотвращая непосредственное или косвенное выполнение их методов. ObjectInputFilter описывает использование фильтров, а ObjectInputFilter.Config описывает настройку фильтра и фабрики фильтров. Каждый поток имеет необязательный фильтр десериализации для проверки классов и лимитов ресурсов во время десериализации. Фабрика фильтров JVM гарантирует, что фильтр может быть установлен на каждом ObjectInputStream, и каждый объект, считанный из потока, может быть проверен. Конструкторы ObjectInputStream вызывают фабрику фильтров для выбора начального фильтра, который может быть обновлен или заменен с помощью setObjectInputFilter(java.io.ObjectInputFilter).

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

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

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

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

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

Примитивные типы данных могут быть считанны из потока с помощью соответствующего метода DataInput.

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

Чтение объекта аналогично выполнению конструкторов нового объекта. Память выделяется для объекта и инициализируется нулём (NULL). Для несериализуемых классов вызываются конструкторы без аргументов, а затем поля сериализуемых классов восстанавливаются из потока, начиная с сериализуемого класса, ближайшего к 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 и прерывает процесс чтения.

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

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

Записи сериализуются по-другому, чем обычные сериализуемые или внешне сериализуемые объекты. Во время десериализации вызывается канонический конструктор записи для создания объекта записи. Некоторые методы, связанные с сериализацией, такие как readObject и writeObject, игнорируются для сериализуемых записей. См. Спецификация Java Object Serialization, Раздел 1.13, "Сериализация записей" для дополнительной информации.

С:
1.1
См. также:
  • DataInput
  • ObjectOutputStream
  • Serializable
  • Спецификация Java Object Serialization, Раздел 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

Краткое описание конструкторов

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

Краткое описание методов

Модификатор и тип Метод Описание
int available()
Возвращает количество байтов, которые могут быть считаны без блокировки.
void close()
Закрывает входной поток.
void defaultReadObject()
Считывает нестатические и непеременные поля текущего класса из этого потока.
protected boolean enableResolveObject(boolean enable)
Включает возможность для потока заменять объекты, считанные из потока.
final 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-битное значение типа double.
ObjectInputStream.GetField readFields()
Считывает постоянные поля из потока и делает их доступными по имени.
float readFloat()
Считывает 32-битное значение типа float.
void readFully(byte[] buf)
Считывает байты, блокируя до тех пор, пока все байты не будут считаны.
void readFully(byte[] buf, int off, int len)
Считывает байты, блокируя до тех пор, пока все байты не будут считаны.
int readInt()
Считывает 32-битное значение типа int.
String readLine()
Устаревший.
Этот метод не преобразует байты в символы должным образом.
long readLong()
Считывает 64-битное значение типа long.
final Object readObject()
Считывает объект из ObjectInputStream.
protected Object readObjectOverride()
Этот метод вызывается доверенными подклассами ObjectInputStream, которые создали ObjectInputStream с помощью защищенного конструктора без аргументов.
short readShort()
Считывает 16-битное значение типа short.
protected void readStreamHeader()
Метод readStreamHeader предоставлен для того, чтобы подклассы могли считывать и проверять собственные заголовки потока.
Object readUnshared()
Считывает «неразделяемый» объект из ObjectInputStream.
int readUnsignedByte()
Считывает беззнаковое 8-битное значение типа byte.
int readUnsignedShort()
Считывает беззнаковое 16-битное значение типа short.
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)
Возвращает прокси-класс, реализующий интерфейсы, указанные в дескрипторе прокси-класса; подклассы могут реализовать этот метод для считывания пользовательских данных из потока вместе с дескрипторами для динамических прокси-классов, что позволит им использовать альтернативный механизм загрузки для интерфейсов и прокси-класса.
final void setObjectInputFilter(ObjectInputFilter filter)
Устанавливает фильтр десериализации для потока.
int skipBytes(int len)
Пропускает байты.

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

mark, markSupported, nullInputStream, read, readAllBytes, readNBytes, readNBytes, reset, skip, skipNBytes, 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, который считывает данные из указанного потока ввода. Заголовок потока сериализации считывается из потока и проверяется. Данный конструктор будет блокироваться до тех пор, пока соответствующий ObjectOutputStream не запишет и не сбросит заголовок.

Конструктор инициализирует фильтр десериализации фильтром, возвращаемым вызовом ObjectInputFilter.Config.getSerialFilterFactory() с null для текущего фильтра и статическим JVM-фильтром по запрошенному фильтру.

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

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

ObjectInputStream

protected ObjectInputStream() throws IOException, SecurityException
Предоставляет возможность подклассам, полностью переопределяющим ObjectInputStream, не выделять частные данные, используемые только этой реализацией ObjectInputStream.

Конструктор инициализирует фильтр десериализации фильтром, возвращаемым вызовом ObjectInputFilter.Config.getSerialFilterFactory() с null для текущего фильтра и статическим JVM-фильтром по запрошенному фильтру.

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

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

Подробное описание методов

readObject

public final Object readObject() throws IOException, ClassNotFoundException
Считывает объект из ObjectInputStream. Считываются класс объекта, сигнатура класса и значения полей класса и всех его супертипов, не являющихся transient и static. По умолчанию десериализация класса может быть переопределена с помощью методов writeObject и readObject. Объекты, на которые ссылается этот объект, считываются транзитивно, чтобы восстановить полную эквивалентную граф объектов при вызове readObject.

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

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

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

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

readObjectOverride

protected Object readObjectOverride() throws IOException, ClassNotFoundException
Этот метод вызывается надёжными подклассами ObjectInputStream, которые создали ObjectInputStream, используя защищённый конструктор без аргументов. Ожидается, что подкласс предоставит переопределённый метод с модификатором "final".
Возвращает:
объект, считанный из потока.
Исключения:
ClassNotFoundException - Определение класса сериализованного объекта не найдено.
OptionalDataException - В потоке обнаружены примитивные данные вместо объектов.
IOException - если при чтении из базового потока произошли ошибки ввода-вывода
См. также:
  • ObjectInputStream()
  • readObject()
С тех пор:
1.2

readUnshared

public Object readUnshared() throws IOException, ClassNotFoundException
Считывает "необщий" объект из ObjectInputStream. Этот метод идентичен readObject, за исключением того, что он предотвращает последующие вызовы readObject и readUnshared от возвращения дополнительных ссылок на десериализованный экземпляр, полученный посредством этого вызова. В частности:
  • Если readUnshared вызывается для десериализации обратной ссылки (представления объекта в потоке, который был ранее записан в поток), будет выброшено исключение ObjectStreamException.
  • Если readUnshared возвращается успешно, то любые последующие попытки десериализовать обратные ссылки на обработку потока, десериализованную с помощью readUnshared, приведут к выбросу исключения ObjectStreamException.
Десериализация объекта с помощью readUnshared делает недоступной дескриптор потока, связанный с возвращённым объектом. Обратите внимание, что само по себе это не всегда гарантирует уникальность возвращённой ссылки readUnshared; десериализованный объект может определять метод readResolve, возвращающий объект, видимый другим сторонам, или readUnshared может возвращать объект класса или константу перечисления, доступную в другом месте потока или через внешние средства. Если десериализованный объект определяет метод readResolve, и вызов этого метода возвращает массив, то readUnshared возвращает неглубокую копию этого массива; это гарантирует, что возвращённый объект массива уникален и не может быть получен во второй раз из вызова readObject или readUnshared на ObjectInputStream, даже если базовый поток данных был изменён.

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

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

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

defaultReadObject

public void defaultReadObject() throws IOException, ClassNotFoundException
Считывает нестатические и не transient поля текущего класса из потока. Этот метод может быть вызван только из метода 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 бит.
Определено в:
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()
Возвращает фильтр десериализации для этого потока. Фильтр является результатом вызова JVM-wide filter factory либо конструктором, либо последним вызовом setObjectInputFilter.
Возвращает:
фильтр десериализации для потока; может быть null
С:
9

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

public final void setObjectInputFilter(ObjectInputFilter filter)
Устанавливает фильтр десериализации для потока. Фильтр десериализации устанавливается в фильтр, возвращаемый вызовом глобального фабрики фильтров JVM с текущим фильтром и параметром filter. Текущий фильтр был установлен в конструкторах ObjectInputStream вызовом глобального фабрики фильтров JVM и может быть null. setObjectInputFilter(ObjectInputFilter) Этот метод} можно вызвать один и только один раз до чтения каких-либо объектов из потока; например, вызвав readObject() или readUnshared().

Замена non-null фильтра на null фильтр запрещена. Если текущий фильтр non-null, значение, возвращаемое фабрикой фильтров, должно быть non-null.

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

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

Требования к реализации:
Фильтр, если не 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 когда текущий фильтр не равен null, или если фильтр уже был установлен.
С:
9

© 1993, 2021, 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/17/docs/api/java.base/java/io/ObjectInputStream.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API