Класс ObjectInputStream
- Все реализуемые интерфейсы:
Closeable, DataInput, ObjectInput, ObjectStreamConstants, AutoCloseable
public class ObjectInputStream extends InputStream implements ObjectInput, ObjectStreamConstants
Предупреждение: десериализация недоверенных данных по своей природе опасна, и её следует избегать. Недоверенные данные необходимо тщательно проверять в соответствии с разделом «Сериализация и десериализация» Руководства по безопасному программированию для 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
- Внешние спецификации
- См. также:
Краткое описание вложенных классов
| Модификатор и тип | Класс | Описание |
|---|---|---|
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 |
Новая строка. |
Краткое описание конструкторов
| Модификатор | Конструктор | Описание |
|---|---|---|
protected |
Предоставляет подклассам, полностью переопределяющим ObjectInputStream, возможность не выделять память под закрытые данные, используемые только этой реализацией ObjectInputStream. |
|
| Создаёт ObjectInputStream, считывающий данные из указанного InputStream. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
int |
available() |
Возвращает количество байтов, которые можно прочитать без блокировки. |
void |
close() |
Закрывает этот входной поток и освобождает связанные с ним системные ресурсы. |
void |
defaultReadObject() |
Считывает из этого потока нестатические и нетранзиентные поля текущего класса. |
protected boolean |
enableResolveObject |
Разрешает потоку заменять объекты, считываемые из потока. |
final ObjectInputFilter |
getObjectInputFilter() |
Возвращает фильтр десериализации для этого потока. |
int |
read() |
Считывает байт данных. |
int |
read |
Считывает данные в массив байтов. |
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 |
Считывает байты, блокируя выполнение до тех пор, пока не будут прочитаны все байты. |
void |
readFully |
Считывает байты, блокируя выполнение до тех пор, пока не будут прочитаны все байты. |
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 |
Регистрирует объект для проверки перед возвратом графа. |
protected Class |
resolveClass |
Загружает локальный класс, соответствующий описанию класса из указанного потока. |
protected Object |
resolveObject |
Этот метод позволяет доверенным подклассам ObjectInputStream заменять один объект другим во время десериализации. |
protected Class |
resolveProxyClass |
Возвращает класс-прокси, реализующий интерфейсы, указанные в дескрипторе класса-прокси; подклассы могут реализовать этот метод для чтения пользовательских данных из потока вместе с дескрипторами классов динамических прокси, что позволяет использовать альтернативный механизм загрузки интерфейсов и класса-прокси. |
final void |
setObjectInputFilter |
Задаёт фильтр десериализации для потока. |
int |
skipBytes |
Пропускает байты. |
Методы, объявленные в классе InputStream
mark, markSupported, nullInputStream, read, readAllBytes, readNBytes, readNBytes, reset, skip, skipNBytes, transferTo | Модификатор и тип | Метод | Описание |
|---|---|---|
void |
mark |
Отмечает текущую позицию в этом входном потоке. |
boolean |
markSupported() |
Проверяет, поддерживает ли этот входной поток методы mark и reset. |
static InputStream |
nullInputStream() |
Возвращает новый InputStream, который не считывает байты. |
int |
read |
Считывает некоторое количество байтов из входного потока и сохраняет их в буфере-массиве b. |
byte[] |
readAllBytes() |
Считывает все оставшиеся байты из входного потока. |
int |
readNBytes |
Считывает из входного потока запрошенное количество байтов в указанный массив байтов. |
byte[] |
readNBytes |
Считывает из входного потока не более указанного количества байтов. |
void |
reset() |
Перемещает этот поток в позицию, соответствовавшую моменту последнего вызова метода mark для этого входного потока. |
long |
skip |
Пропускает и отбрасывает n байтов данных из этого входного потока. |
void |
skipNBytes |
Пропускает и отбрасывает ровно n байтов данных из этого входного потока. |
long |
transferTo |
Считывает все байты из этого входного потока и записывает их в указанный выходной поток в том же порядке, в котором они были считаны. |
Методы, объявленные в классе Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait | Модификатор и тип | Метод | Описание |
|---|---|---|
protected Object |
clone() |
Создаёт и возвращает копию этого объекта. |
boolean |
equals |
Указывает, является ли другой объект «равным» этому. |
protected void |
finalize() |
Устарело, будет удалено: этот элемент API может быть удалён в будущей версии. Финализация устарела и будет удалена в одном из будущих выпусков. |
final Class |
getClass() |
Возвращает класс времени выполнения для этого Object. |
int |
hashCode() |
Возвращает значение хеш-кода для этого объекта. |
final void |
notify() |
Пробуждает один поток, ожидающий на мониторе этого объекта. |
final void |
notifyAll() |
Пробуждает все потоки, ожидающие на мониторе этого объекта. |
String |
toString() |
Возвращает строковое представление объекта. |
final void |
wait() |
Заставляет текущий поток ожидать пробуждения, обычно в результате вызова метода уведомления или прерывания. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно в результате вызова метода уведомления или прерывания, либо истечения заданного промежутка реального времени. |
final void |
wait |
Заставляет текущий поток ожидать пробуждения, обычно в результате вызова метода уведомления или прерывания, либо истечения заданного промежутка реального времени. |
Методы, объявленные в интерфейсе ObjectInput
read, skip | Модификатор и тип | Метод | Описание |
|---|---|---|
int |
read |
Считывает данные в массив байтов. |
long |
skip |
Пропускает n байтов входных данных. |
Подробное описание конструкторов
ObjectInputStream
public ObjectInputStream(InputStream in) throws IOException
Конструктор инициализирует фильтр десериализации фильтром, возвращаемым при вызове фабрики фильтров сериализации, полученной из ObjectInputFilter.Config.getSerialFilterFactory(), с null для текущего фильтра и статическим фильтром для всей JVM для запрошенного фильтра. Если свойства фильтра сериализации или фабрики фильтров сериализации заданы некорректно, выбрасывается IllegalStateException. При вызове метода apply фабрики фильтров может быть выброшено исключение времени выполнения, препятствующее созданию ObjectInputStream.
- Параметры:
-
in— входной поток для чтения - Исключения:
-
StreamCorruptedException— если заголовок потока неверен -
IOException— если при чтении заголовка потока произошла ошибка ввода-вывода -
IllegalStateException— если не удалось инициализироватьObjectInputFilter.Configиз-за некорректных свойств фильтра сериализации или фабрики фильтров сериализации. -
NullPointerException— еслиinимеет значениеnull - См. также:
ObjectInputStream
protected ObjectInputStream() throws IOException
Конструктор инициализирует фильтр десериализации фильтром, возвращаемым при вызове фабрики фильтров сериализации, полученной из ObjectInputFilter.Config.getSerialFilterFactory(), с null для текущего фильтра и статическим фильтром для всей JVM для запрошенного фильтра. Если свойства фильтра сериализации или фабрики фильтров сериализации заданы некорректно, выбрасывается IllegalStateException. При вызове метода apply фабрики фильтров может быть выброшено исключение времени выполнения, препятствующее созданию ObjectInputStream.
- Исключения:
-
IOException— если при создании этого потока произошла ошибка ввода-вывода -
IllegalStateException— если не удалось инициализироватьObjectInputFilter.Configиз-за некорректных свойств фильтра сериализации или фабрики фильтров сериализации.
Подробное описание методов
readObject
public final Object readObject() throws IOException, ClassNotFoundException
Корневой объект полностью восстанавливается, когда полностью восстановлены все его поля и объекты, на которые он ссылается. После этого в порядке, определяемом зарегистрированными приоритетами, выполняются обратные вызовы проверки объектов. Обратные вызовы регистрируются объектами (в специальных методах readObject) по мере их восстановления.
Фильтр десериализации, если он не null, вызывается для каждого объекта (обычного или класса), считываемого при восстановлении корневого объекта. Подробности см. в разделе setObjectInputFilter.
При проблемах с InputStream и для классов, которые не следует десериализовать, выбрасываются исключения. Все исключения являются фатальными для InputStream и оставляют его в неопределенном состоянии; вызывающий код должен самостоятельно решить, игнорировать ли состояние потока или пытаться его восстановить.
- Определено в:
-
readObjectв интерфейсеObjectInput - Возвращает:
- объект, считанный из потока
- Исключения:
-
ClassNotFoundException— класс сериализованного объекта не найден. -
InvalidClassException— проблема с классом, используемым при десериализации. -
StreamCorruptedException— управляющая информация в потоке противоречива. -
OptionalDataException— в потоке обнаружены примитивные данные вместо объектов. -
IOException— любое из стандартных исключений, связанных с вводом-выводом.
readObjectOverride
protected Object readObjectOverride() throws IOException, ClassNotFoundException
- Возвращает:
- объект, считанный из потока.
- Исключения:
-
ClassNotFoundException— определение класса сериализованного объекта не найдено. -
OptionalDataException— в потоке обнаружены примитивные данные вместо объектов. -
IOException— если при чтении из базового потока произошли ошибки ввода-вывода - Начиная с версии:
- 1.2
- См. также:
defaultReadObject
public void defaultReadObject() throws IOException, ClassNotFoundException
- Исключения:
-
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
- Параметры:
-
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
- См. также:
resolveObject
protected Object resolveObject(Object obj) throws IOException
Этот метод вызывается после считывания объекта, но до его возврата из readObject. Реализация resolveObject по умолчанию просто возвращает тот же объект.
При замене объектов подкласс должен гарантировать совместимость подставленного объекта с каждым полем, в котором будет храниться ссылка. Если тип объекта не является подклассом типа поля или элемента массива, десериализация прерывается с выбрасыванием исключения, и объект не сохраняется.
Этот метод вызывается только один раз при первом обнаружении каждого объекта. Все последующие ссылки на объект перенаправляются на новый объект.
- Параметры:
-
obj— объект, который нужно подставить вместо исходного - Возвращает:
- подставленный объект
- Исключения:
-
IOException— любое из стандартных исключений ввода-вывода.
enableResolveObject
protected boolean enableResolveObject(boolean enable)
resolveObject(Object) вызывается для каждого десериализуемого объекта.- Параметры:
-
enable— true, чтобы включить использованиеresolveObjectдля каждого десериализуемого объекта - Возвращает:
- предыдущее значение параметра до вызова этого метода
readStreamHeader
protected void readStreamHeader() throws IOException, StreamCorruptedException
- Исключения:
-
IOException— если при чтении из базовогоInputStreamпроизошли ошибки ввода-вывода -
StreamCorruptedException— если управляющая информация в потоке противоречива
readClassDescriptor
protected ObjectStreamClass readClassDescriptor() throws IOException, ClassNotFoundException
writeClassDescriptor). По умолчанию этот метод считывает дескрипторы классов в соответствии с форматом, определенным в спецификации сериализации объектов.- Возвращает:
- считанный дескриптор класса
- Исключения:
-
IOException— если произошла ошибка ввода-вывода. -
ClassNotFoundException— если класс сериализованного объекта, использованный в представлении дескриптора класса, не найден - Начиная с версии:
- 1.3
- См. также:
read
public int read() throws IOException
- Определено в:
-
readв интерфейсеObjectInput - Определено в:
-
readв классеInputStream - Возвращает:
- считанный байт или -1, если достигнут конец потока.
- Исключения:
-
IOException— если произошла ошибка ввода-вывода.
read
public int read(byte[] buf, int off, int len) throws IOException
- Определено в:
-
readв интерфейсеObjectInput - Переопределяет:
-
readв классеInputStream - Параметры:
-
buf— буфер, в который считываются данные -
off— начальное смещение в массиве назначенияbuf -
len— максимальное количество считываемых байтов - Возвращает:
- общее количество байтов, считанных в буфер, или
-1, если данные закончились из-за достижения конца потока. - Исключения:
-
NullPointerException— еслиbufравноnull. -
IndexOutOfBoundsException— еслиoffотрицательно,lenотрицательно илиlenбольшеbuf.length - off. -
IOException— если произошла ошибка ввода-вывода. - См. также:
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
- Определено в:
-
readByteв интерфейсеDataInput - Возвращает:
- считанный 8-битный байт.
- Исключения:
-
EOFException— если достигнут конец файла. -
IOException— если произошла другая ошибка ввода-вывода.
readUnsignedByte
public int readUnsignedByte() throws IOException
- Определено в:
-
readUnsignedByteв интерфейсеDataInput - Возвращает:
- считанный 8-битный байт.
- Исключения:
-
EOFException— если достигнут конец файла. -
IOException— если произошла другая ошибка ввода-вывода.
readChar
public char readChar() throws IOException
- Определено в:
-
readCharв интерфейсеDataInput - Возвращает:
- считанный 16-битный символ.
- Исключения:
-
EOFException— если достигнут конец файла. -
IOException— если произошла другая ошибка ввода-вывода.
readShort
public short readShort() throws IOException
- Определено в:
-
readShortв интерфейсеDataInput - Возвращает:
- считанное 16-битное значение типа short.
- Исключения:
-
EOFException— если достигнут конец файла. -
IOException— если произошла другая ошибка ввода-вывода.
readUnsignedShort
public int readUnsignedShort() throws IOException
- Определено в:
-
readUnsignedShortв интерфейсеDataInput - Возвращает:
- считанное 16-битное значение типа short.
- Исключения:
-
EOFException— если достигнут конец файла. -
IOException— если произошла другая ошибка ввода-вывода.
readInt
public int readInt() throws IOException
- Определено в:
-
readIntв интерфейсеDataInput - Возвращает:
- считанное 32-битное целое число.
- Исключения:
-
EOFException— если достигнут конец файла. -
IOException— если произошла другая ошибка ввода-вывода.
readLong
public long readLong() throws IOException
- Определено в:
-
readLongв интерфейсеDataInput - Возвращает:
- считанное 64-битное значение типа long.
- Исключения:
-
EOFException— если достигнут конец файла. -
IOException— если произошла другая ошибка ввода-вывода.
readFloat
public float readFloat() throws IOException
- Определено в:
-
readFloatв интерфейсеDataInput - Возвращает:
- считанное 32-битное значение типа float.
- Исключения:
-
EOFException— если достигнут конец файла. -
IOException— если произошла другая ошибка ввода-вывода.
readDouble
public double readDouble() throws IOException
- Определено в:
-
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
- Указано в:
-
readLineв интерфейсеDataInput - Возвращает:
- копию строки в виде String.
- Исключения:
-
IOException- если при чтении из базовогоInputStreamпроизошли ошибки ввода-вывода
readUTF
public String readUTF() throws IOException
- Указано в:
-
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)
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; оно увеличивается перед чтением объекта. - каждой ссылки на объект, ранее десериализованный из потока (class равен
- Параметры:
-
filter- фильтр; может быть null - Исключения:
-
IllegalStateException- если объект уже был считан, если фабрика фильтров возвращаетnull, когда текущий фильтр не равен null, или если фильтр уже был установлен. - Начиная с версии:
- 9
© 1993, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.