Spec-Zone.ru › OpenJDK 21

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

Предупреждение: Десериализация недоверенных данных изначально опасна и должна быть избегаема. Недоверенные данные должны быть тщательно валидированы в соответствии с разделом «Сериализация и десериализация» руководства 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 Virtual Machine. Классы загружаются по мере необходимости с помощью стандартных механизмов.

Только объекты, поддерживающие интерфейсы 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-битное короткое целое число.
protected void readStreamHeader()
Метод readStreamHeader предназначен для того, чтобы подклассы могли считывать и проверять собственные заголовки потока.
Object readUnshared()
Считывает "необщий" объект из ObjectInputStream.
int readUnsignedByte()
Считывает беззнаковый 8-битный байт.
int readUnsignedShort()
Считывает беззнаковый 16-битный короткий.
String readUTF()
Считывает строку в формате измененного UTF-8.
void registerValidation(ObjectInputValidation obj, int prio)
Регистрирует объект, который должен быть проверен перед возвратом графа.
protected Class<?> resolveClass(ObjectStreamClass desc)
Загружает локальный эквивалент указанного дескриптора класса потока.
protected Object resolveObject(Object obj)
Этот метод позволит доверенным подклассам ObjectInputStream подставить один объект другому во время десериализации.
protected Class<?> resolveProxyClass(String[] interfaces)
Возвращает класс-прокси, реализующий интерфейсы, указанные в дескрипторе класса-прокси; подклассы могут реализовывать этот метод для считывания пользовательских данных из потока вместе с дескрипторами для динамических классов-прокси, что позволит им использовать альтернативный механизм загрузки для интерфейсов и класса-прокси.
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, который считывает данные из указанного потока InputStream. Из потока считывается и проверяется заголовок потока сериализации. Этот конструктор будет блокироваться, пока соответствующий ObjectOutputStream не запишет и не сбросит заголовок.

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

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

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

ObjectInputStream

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

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

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

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

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

readObject

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

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

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

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

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

readObjectOverride

protected Object readObjectOverride() throws IOException, ClassNotFoundException
Этот метод вызывается надёжными подклассами 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.

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

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

defaultReadObject

public void defaultReadObject() throws IOException, ClassNotFoundException
Считывает нестатические и нетранзиентные поля текущего класса из этого потока. Этот метод может вызываться только из метода readObject класса, который десериализуется. Он бросит исключение NotActiveException, если вызван в другом случае.
Исключения:
ClassNotFoundException - если класс сериализованного объекта не найден.
IOException - если произошла ошибка ввода/вывода.
NotActiveException - если поток в данный момент не считывает объекты.

readFields

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

registerValidation

public void registerValidation(ObjectInputValidation obj, int prio) throws NotActiveException, InvalidObjectException
Зарегистрировать объект для валидации перед возвратом графа. Хотя подобно resolveObject, эти проверки вызываются после того, как весь граф был воссоздан. Обычно метод readObject регистрирует объект в потоке, чтобы после восстановления всех объектов можно было выполнить окончательный набор проверок.
Parameters:
obj - объект, который получит обратный вызов валидации.
prio - управляет порядком обратных вызовов; ноль — хорошее значение по умолчанию. Используйте большие значения для более раннего вызова обратного вызова, меньшие для более позднего вызова. В пределах приоритета обратные вызовы обрабатываются в произвольном порядке.
Throws:
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) throws SecurityException
Включает возможность замены объектов, считанных из потока. При включении метод resolveObject(java.lang.Object) вызывается для каждого десериализуемого объекта.

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

Parameters:
enable - true для включения использования resolveObject для каждого десериализуемого объекта
Returns:
предыдущее состояние перед вызовом этого метода
Throws:
SecurityException - если существует менеджер безопасности и его метод checkPermission запрещает включение замены считываемых из потока объектов.
See Also:
  • SecurityManager.checkPermission(java.security.Permission)
  • SerializablePermission

readStreamHeader

protected void readStreamHeader() throws IOException, StreamCorruptedException
Метод readStreamHeader предназначен для того, чтобы подклассы могли прочитать и проверить собственные заголовки потока. Он считывает и проверяет магическое число и номер версии.
Throws:
IOException - если при чтении из базового InputStream произошли ошибки ввода/вывода
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' байтов.
Указано в:
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
Возвращает:
копию строки в формате String.
Исключения:
IOException - если произошли ошибки ввода-вывода при чтении из базового InputStream

readUTF

public String readUTF() throws IOException
Читает строку в формате modified UTF-8.
Указано в:
readUTF в интерфейсе DataInput
Возвращает:
строку.
Исключения:
IOException - если произошли ошибки ввода-вывода при чтении из базового InputStream
UTFDataFormatException - если прочитанные байты не представляют собой допустимую кодировку modified 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 для каждого объекта (обычного или класса) в потоке. Строки обрабатываются как примитивы и не вызывают фильтр. Фильтр вызывается для:
  • каждой ссылки на объект, ранее десериализованный из потока (класс 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, 2023, 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/21/docs/api/java.base/java/io/ObjectInputStream.html

Spec-Zone.ru

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