Spec-Zone.ru › OpenJDK 24

Класс 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 Secure Coding Guidelines for 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:

    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 со значением поля 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, Раздел 1.13, «Сериализация записей» для получения дополнительной информации.

С момента:
1.1
Внешние спецификации
  • Спецификация сериализации объектов Java
См. также:
  • DataInput
  • ObjectOutputStream
  • Serializable
  • Спецификация сериализации объектов Java, Раздел 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-битное число с плавающей точкой двойной точности.
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-битное целое число.
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()
Считывает беззнаковый short 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)
Возвращает прокси-класс, реализующий интерфейсы, указанные в описателе прокси-класса; подклассы могут реализовать этот метод для чтения пользовательских данных из потока вместе с описателями динамических прокси-классов, позволяя им использовать альтернативный механизм загрузки для интерфейсов и прокси-класса.
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-фильтром для запрошенного фильтра. Если свойства фильтра сериализации или фабрики фильтра сериализации некорректны, будет брошено исключение 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.

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

Определяется в:
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 может вернуть объект класса или константу перечисления, доступную где-то ещё в потоке или через внешние средства. Если десериализованный объект определяет метод 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.
Parameters:
desc - экземпляр класса ObjectStreamClass
Returns:
объект Class, соответствующий desc
Throws:
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.
Parameters:
interfaces - список имён интерфейсов, которые были десериализованы в описателе класса прокси
Returns:
класс-прокси для указанных интерфейсов
Throws:
IOException - любое исключение, сгенерированное базовым InputStream
ClassNotFoundException - если класс-прокси или любой из указанных интерфейсов не найден
Since:
1.3
See Also:
  • ObjectOutputStream.annotateProxyClass(Class)

resolveObject

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

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

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

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

Parameters:
obj - объект, подлежащий замене
Returns:
заменённый объект
Throws:
IOException - Любое из стандартных исключений ввода/вывода.

enableResolveObject

protected boolean enableResolveObject(boolean enable)
Включает возможность потоку подменять объекты, считанные из потока. Когда включено, метод resolveObject(java.lang.Object) вызывается для каждого десериализуемого объекта.
Parameters:
enable - true для включения использования resolveObject для каждого десериализуемого объекта
Returns:
предыдущее значение до вызова этого метода

readStreamHeader

protected void readStreamHeader() throws IOException, StreamCorruptedException
Метод readStreamHeader предназначен для того, чтобы подклассы могли читать и проверять свои собственные заголовки потока. Он считывает и проверяет магическое число и номер версии.
Throws:
IOException - если при чтении из базового потока произошли ошибки ввода/вывода
StreamCorruptedException - если информация управления в потоке не согласована

readClassDescriptor

protected ObjectStreamClass readClassDescriptor() throws IOException, ClassNotFoundException
Считывает описание класса из потока сериализации. Этот метод вызывается, когда ObjectInputStream ожидает описание класса как следующий элемент в потоке сериализации. Подклассы ObjectInputStream могут переопределить этот метод, чтобы считывать описания классов, записанные в нестандартных форматах (подклассами ObjectOutputStream, которые переопределили метод writeClassDescriptor). По умолчанию этот метод считывает описания классов в соответствии с форматом, определённым в спецификации сериализации объектов.
Returns:
считанное описание класса
Throws:
IOException - Если произошла ошибка ввода/вывода.
ClassNotFoundException - Если класс сериализованного объекта, используемого в представлении описания класса, не найден
Since:
1.3
See Also:
  • ObjectOutputStream.writeClassDescriptor(java.io.ObjectStreamClass)

read

public int read() throws IOException
Считывает байт данных. Этот метод будет блокироваться, если входные данные недоступны.
Specified by:
read в интерфейсе ObjectInput
Specified by:
read в классе InputStream
Returns:
прочитанный байт или -1, если достигнут конец потока.
Throws:
IOException - если произошла ошибка ввода/вывода.

read

public int read(byte[] buf, int off, int len) throws IOException
Считывает данные в массив байтов. Этот метод будет блокироваться, пока не станут доступны входные данные. Рассмотрите использование java.io.DataInputStream.readFully для считывания ровно 'length' байтов.
Specified by:
read в интерфейсе ObjectInput
Overrides:
read в классе InputStream
Parameters:
buf - буфер, в который считываются данные
off - начальный смещение в целевом массиве buf
len - максимальное количество считанных байтов
Returns:
общее количество байтов, считанных в буфер, или -1, если больше нет данных из-за достижения конца потока.
Throws:
NullPointerException - если buf равно null.
IndexOutOfBoundsException - если off отрицательно, len отрицательно или len больше buf.length - off.
IOException - Если произошла ошибка ввода/вывода.
See Also:
  • 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
Исключения:
IllegalStateException - если объект был прочитан, если фабрика фильтров возвращает null, когда текущий фильтр не равен null, или если фильтр уже был установлен.
С:
9

© 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://download.java.net/java/early_access/jdk24/docs/api/java.base/java/io/ObjectInputStream.html

Spec-Zone.ru

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