Spec-Zone.ru › OpenJDK 25

Класс 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(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:

    try (FileInputStream fis = new FileInputStream("t.tmp");
         ObjectInputStream ois = new ObjectInputStream(fis)) {
        String label = (String) ois.readObject();
        LocalDateTime dateTime = (LocalDateTime) ois.readObject();
        // Use label and dateTime
    } catch (Exception ex) {
        // handle exception
    }

Классы управляют способом своей сериализации, реализуя интерфейс 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 со значением true в поле eof. Попытки чтения данных, не являющихся объектами, за пределами выделенных данных будут обозначать конец данных так же, как и конец потока: при побайтовом чтении будет возвращено значение -1 в качестве считанного байта или количества считанных байтов, а при чтении примитивных значений будут выброшены EOFExceptions. Если соответствующий метод writeObject отсутствует, конец сериализованных данных по умолчанию обозначает конец выделенных данных.

Вызовы методов чтения примитивных значений и объектов изнутри метода readExternal ведут себя одинаково: если поток уже находится в конце данных, записанных соответствующим методом writeExternal, при чтении объектов будут выброшены OptionalDataExceptions со значением true в поле eof, при побайтовом чтении будет возвращено значение -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, раздел 1.13 «Сериализация записей».

Начиная с версии:
1.1
Внешние спецификации
  • Спецификация сериализации объектов Java
См. также:
  • DataInput
  • ObjectOutputStream
  • Serializable
  • Спецификация сериализации объектов Java, раздел 3 «Классы чтения объектов»

Краткое описание вложенных классов

Модификатор и тип Класс Описание
static class  ObjectInputStream.GetField
Предоставляет доступ к сохраняемым полям, считанным из входного потока.

Краткое описание полей

Поля, объявленные в интерфейсе 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()
Считывает значение типа boolean.
byte readByte()
Считывает 8-битный байт.
char readChar()
Считывает 16-битный символ char.
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-битный байт.
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)
Пропускает байты.

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

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

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

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

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

read, skip

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

ObjectInputStream

public ObjectInputStream(InputStream in) throws IOException
Создаёт ObjectInputStream, который считывает данные из указанного InputStream. Из потока считывается и проверяется заголовок потока сериализации. Этот конструктор будет заблокирован до тех пор, пока соответствующий ObjectOutputStream не запишет и не сбросит заголовок.

Конструктор инициализирует фильтр десериализации фильтром, возвращённым при вызове фабрики фильтров сериализации, полученной из ObjectInputFilter.Config.getSerialFilterFactory(), с null для текущего фильтра и фильтром, действующим на всю JVM для запрошенного фильтра. Если свойства фильтра сериализации или фабрики фильтров сериализации недопустимы, выбрасывается IllegalStateException. При вызове метода фабрики фильтров apply может выбросить исключение времени выполнения, препятствующее созданию ObjectInputStream.

Параметры:
in — входной поток для чтения
Выбрасывает:
StreamCorruptedException — если заголовок потока некорректен
IOException — если при чтении заголовка потока произошла ошибка ввода-вывода
IllegalStateException — если инициализация ObjectInputFilter.Config завершается с ошибкой из-за недопустимых свойств фильтра сериализации или фабрики фильтров сериализации.
NullPointerException — если in имеет значение null
См. также:
  • ObjectInputStream()
  • readFields()
  • ObjectOutputStream(OutputStream)

ObjectInputStream

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

Конструктор инициализирует фильтр десериализации фильтром, возвращённым при вызове фабрики фильтров сериализации, полученной из ObjectInputFilter.Config.getSerialFilterFactory(), с null для текущего фильтра и фильтром, действующим на всю JVM для запрошенного фильтра. Если свойства фильтра сериализации или фабрики фильтров сериализации недопустимы, выбрасывается IllegalStateException. При вызове метода фабрики фильтров apply может выбросить исключение времени выполнения, препятствующее созданию ObjectInputStream.

Выбрасывает:
IOException — если при создании этого потока произошла ошибка ввода-вывода
IllegalStateException — если инициализация ObjectInputFilter.Config завершается с ошибкой из-за недопустимых свойств фильтра сериализации или фабрики фильтров сериализации.

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

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
Этот метод вызывается доверенными подклассами ObjectInputStream, создавшими ObjectInputStream с помощью защищённого конструктора без аргументов. Предполагается, что подкласс предоставит метод-переопределение с модификатором "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.

Возвращает:
ссылку на десериализованный объект
Выбрасывает:
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)
Разрешает потоку заменять объекты, считанные из потока. Если замена включена, метод resolveObject(Object) вызывается для каждого десериализуемого объекта.
Параметры:
enable — true, чтобы включить использование resolveObject для каждого десериализуемого объекта
Возвращает:
предыдущее значение параметра до вызова этого метода

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
Считывает данные в массив байтов. Этот метод блокируется до тех пор, пока не станут доступны входные данные. Чтобы считать ровно 'length' байтов, рекомендуется использовать java.io.DataInputStream.readFully.
Определён в:
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
Считывает значение boolean.
Определён в:
readBoolean в интерфейсе DataInput
Возвращает:
считанное значение boolean.
Выбрасывает:
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-битное значение char.
Определён в:
readChar в интерфейсе DataInput
Возвращает:
считанное 16-битное значение char.
Выбрасывает:
EOFException — если достигнут конец файла.
IOException — если произошла другая ошибка ввода-вывода.

readShort

public short readShort() throws IOException
Считывает 16-битное значение short.
Определён в:
readShort в интерфейсе DataInput
Возвращает:
считанное 16-битное значение short.
Выбрасывает:
EOFException — если достигнут конец файла.
IOException — если произошла другая ошибка ввода-вывода.

readUnsignedShort

public int readUnsignedShort() throws IOException
Считывает беззнаковое 16-битное значение short.
Определён в:
readUnsignedShort в интерфейсе DataInput
Возвращает:
считанное 16-битное значение short.
Выбрасывает:
EOFException — если достигнут конец файла.
IOException — если произошла другая ошибка ввода-вывода.

readInt

public int readInt() throws IOException
Считывает 32-битное значение int.
Определён в:
readInt в интерфейсе DataInput
Возвращает:
считанное 32-битное целое число.
Выбрасывает:
EOFException — если достигнут конец файла.
IOException — если произошла другая ошибка ввода-вывода.

readLong

public long readLong() throws IOException
Считывает 64-битное значение long.
Определён в:
readLong в интерфейсе DataInput
Возвращает:
считанное 64-битное значение long.
Выбрасывает:
EOFException — если достигнут конец файла.
IOException — если произошла другая ошибка ввода-вывода.

readFloat

public float readFloat() throws IOException
Считывает 32-битное значение float.
Определён в:
readFloat в интерфейсе DataInput
Возвращает:
считанное 32-битное значение float.
Выбрасывает:
EOFException — если достигнут конец файла.
IOException — если произошла другая ошибка ввода-вывода.

readDouble

public double readDouble() throws IOException
Считывает 64-битное значение double.
Определён в:
readDouble в интерфейсе DataInput
Возвращает:
считанное 64-битное значение double.
Выбрасывает:
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
Возвращает:
копию строки в виде String.
Вызывает исключение:
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

setObjectInputFilter

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

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

Параметры:
filter - фильтр, может быть null
Вызывает исключение:
IllegalStateException - если объект уже был считан, если фабрика фильтров возвращает null при ненулевом текущем фильтре или если фильтр уже был установлен.
Начиная с:
9

Сообщить об ошибке или предложить улучшение
Дополнительные справочные материалы по API и документацию для разработчиков см. в документации Java SE, содержащей более подробные описания для разработчиков, концептуальные обзоры, определения терминов, обходные решения и работающие примеры кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или её аффилированных лиц в США и других странах.
Авторское право © 1993, 2025, Oracle и/или её аффилированные лица, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

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

Spec-Zone.ru

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