Spec-Zone.ru › OpenJDK 27

Класс 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
Модификатор и тип Поле Описание
static final int baseWireHandle
Первый дескриптор wire, который будет назначен.
static final int PROTOCOL_VERSION_1
Версия протокола потока.
static final int PROTOCOL_VERSION_2
Версия протокола потока.
static final byte SC_BLOCK_DATA
Битовая маска флага ObjectStreamClass.
static final byte SC_ENUM
Битовая маска флага ObjectStreamClass.
static final byte SC_EXTERNALIZABLE
Битовая маска флага ObjectStreamClass.
static final byte SC_SERIALIZABLE
Битовая маска флага ObjectStreamClass.
static final byte SC_WRITE_METHOD
Битовая маска флага ObjectStreamClass.
static final SerializablePermission SERIAL_FILTER_PERMISSION
Разрешает настройку системного фильтра сериализации.
static final short STREAM_MAGIC
Магическое число, записываемое в заголовок потока.
static final short STREAM_VERSION
Номер версии, записываемый в заголовок потока.
static final SerializablePermission SUBCLASS_IMPLEMENTATION_PERMISSION
Разрешает переопределение readObject и writeObject.
static final SerializablePermission SUBSTITUTION_PERMISSION
Разрешает замену одного объекта другим во время сериализации/десериализации.
static final byte TC_ARRAY
Новый массив.
static final byte TC_BASE
Первое значение тега.
static final byte TC_BLOCKDATA
Блок необязательных данных.
static final byte TC_BLOCKDATALONG
Длинный блок данных.
static final byte TC_CLASS
Ссылка на класс.
static final byte TC_CLASSDESC
Новый дескриптор класса.
static final byte TC_ENDBLOCKDATA
Конец блоков необязательных данных объекта.
static final byte TC_ENUM
Новая константа перечисления.
static final byte TC_EXCEPTION
Исключение при записи.
static final byte TC_LONGSTRING
Длинная строка.
static final byte TC_MAX
Последнее значение тега.
static final byte TC_NULL
Ссылка на объект null.
static final byte TC_OBJECT
Новый объект.
static final byte TC_PROXYCLASSDESC
Новый дескриптор класса-прокси.
static final byte TC_REFERENCE
Ссылка на объект, уже записанный в поток.
static final byte TC_RESET
Сброс контекста потока.
static final byte 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
Модификатор и тип Метод Описание
void mark(int readlimit)
Отмечает текущую позицию в этом входном потоке.
boolean markSupported()
Проверяет, поддерживает ли этот входной поток методы mark и reset.
static InputStream nullInputStream()
Возвращает новый InputStream, который не считывает байты.
int read(byte[] b)
Считывает некоторое количество байтов из входного потока и сохраняет их в буфере-массиве b.
byte[] readAllBytes()
Считывает все оставшиеся байты из входного потока.
int readNBytes(byte[] b, int off, int len)
Считывает из входного потока запрошенное количество байтов в указанный массив байтов.
byte[] readNBytes(int len)
Считывает из входного потока не более указанного количества байтов.
void reset()
Перемещает этот поток в позицию, соответствовавшую моменту последнего вызова метода mark для этого входного потока.
long skip(long n)
Пропускает и отбрасывает n байтов данных из этого входного потока.
void skipNBytes(long n)
Пропускает и отбрасывает ровно n байтов данных из этого входного потока.
long transferTo(OutputStream out)
Считывает все байты из этого входного потока и записывает их в указанный выходной поток в том же порядке, в котором они были считаны.

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

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Модификатор и тип Метод Описание
protected Object clone()
Создаёт и возвращает копию этого объекта.
boolean equals(Object obj)
Указывает, является ли другой объект «равным» этому.
protected void finalize()
Устарело, будет удалено: этот элемент API может быть удалён в будущей версии.
Финализация устарела и будет удалена в одном из будущих выпусков.
final Class<?> getClass()
Возвращает класс времени выполнения для этого Object.
int hashCode()
Возвращает значение хеш-кода для этого объекта.
final void notify()
Пробуждает один поток, ожидающий на мониторе этого объекта.
final void notifyAll()
Пробуждает все потоки, ожидающие на мониторе этого объекта.
String toString()
Возвращает строковое представление объекта.
final void wait()
Заставляет текущий поток ожидать пробуждения, обычно в результате вызова метода уведомления или прерывания.
final void wait(long timeoutMillis)
Заставляет текущий поток ожидать пробуждения, обычно в результате вызова метода уведомления или прерывания, либо истечения заданного промежутка реального времени.
final void wait(long timeoutMillis, int nanos)
Заставляет текущий поток ожидать пробуждения, обычно в результате вызова метода уведомления или прерывания, либо истечения заданного промежутка реального времени.

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

read, skip
Модификатор и тип Метод Описание
int read(byte[] b)
Считывает данные в массив байтов.
long skip(long n)
Пропускает n байтов входных данных.

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

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, созданными с помощью защищенного конструктора без аргументов. Предполагается, что подкласс предоставляет переопределяющий метод с модификатором "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
Считывает логическое значение.
Определено в:
readBoolean в интерфейсе DataInput
Возвращает:
считанное логическое значение.
Исключения:
EOFException — если достигнут конец файла.
IOException — если произошла другая ошибка ввода-вывода.

readByte

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

readUnsignedByte

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

readChar

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

readShort

public short readShort() throws IOException
Считывает 16-битное значение типа short.
Определено в:
readShort в интерфейсе DataInput
Возвращает:
считанное 16-битное значение типа 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
Считывает String в формате модифицированного UTF-8.
Указано в:
readUTF в интерфейсе DataInput
Возвращает:
String.
Исключения:
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, когда текущий фильтр не равен null, или если фильтр уже был установлен.
Начиная с версии:
9

Сообщить об ошибке или предложить улучшение
Дополнительную справочную информацию по API и документацию для разработчиков см. в документации Java SE, содержащей более подробные описания для разработчиков, обзоры концепций, определения терминов, обходные решения и работающие примеры кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или её аффилированных лиц в США и других странах.
Авторские права © 1993, 2026, 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.

Spec-Zone.ru

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