Класс 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. Фильтрация сериализации описывает лучшие практики для защищенного использования фильтров сериализации.
ObjectOutputStream и ObjectInputStream могут предоставить приложению устойчивое хранилище графов объектов при использовании с FileOutputStream и FileInputStream соответственно. ObjectInputStream используется для восстановления этих ранее сериализованных объектов. Другие применения включают передачу объектов между хостами с помощью потока сокета или для маршаллирования и размаршаллирования аргументов и параметров в системе удалённой коммуникации.
ObjectInputStream гарантирует, что типы всех объектов в графе, созданном из потока, соответствуют классам, присутствующим в виртуальной машине Java. Классы загружаются по мере необходимости с использованием стандартных механизмов.
Из потоков можно считывать только объекты, поддерживающие интерфейсы java.io.Serializable или java.io.Externalizable.
Метод readObject используется для чтения объекта из потока. Для получения желаемого типа следует использовать безопасное приведение Java. В Java строки и массивы являются объектами и обрабатываются как объекты во время сериализации. При чтении их необходимо приводить к ожидаемому типу.
Примитивные типы данных можно считывать из потока, используя соответствующий метод в DataInput.
По умолчанию механизм десериализации объектов восстанавливает содержимое каждого поля до значения и типа, которые оно имело при записи. Поля, объявленные как transient или static, игнорируются процессом десериализации. Ссылки на другие объекты приводят к чтению этих объектов из потока по мере необходимости. Графы объектов восстанавливаются правильно с использованием механизма совместного использования ссылок. При десериализации всегда выделяются новые объекты, что предотвращает перезапись существующих объектов.
Чтение объекта аналогично выполнению конструкторов нового объекта. Память выделяется для объекта и инициализируется нулём. Для несериализуемых классов вызывается конструктор без аргументов, а затем поля сериализуемых классов восстанавливаются из потока, начиная с сериализуемого класса, ближайшего к java.lang.object, и заканчивая самым специфичным классом объекта.
Например, для чтения из потока, как записано в примере в ObjectOutputStream:
FileInputStream fis = new FileInputStream("t.tmp");
ObjectInputStream ois = new ObjectInputStream(fis);
int i = ois.readInt();
String today = (String) ois.readObject();
Date date = (Date) ois.readObject();
ois.close(); Классы контролируют, как они сериализуются, реализуя либо интерфейсы 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 установлен фильтр (установлен фильтр), ObjectInputFilter может проверить, разрешены ли классы, длины массивов, количество ссылок в потоке, глубина и количество байтов, потребленных из входного потока, и в противном случае может прервать десериализацию. Можно настроить фильтр, применяемый ко всем ObjectInputStream на весь процесс, если он не заменён с помощью (setObjectInputFilter).
Любое исключение, возникающее во время десериализации объекта, будет перехвачено ObjectInputStream и прервёт процесс чтения.
Реализация интерфейса Externalizable позволяет объекту полностью контролировать содержимое и формат сериализованной формы объекта. Методы интерфейса Externalizable, writeExternal и readExternal, вызываются для сохранения и восстановления состояния объектов. При реализации классом они могут записывать и читать собственное состояние, используя все методы ObjectOutput и ObjectInput. Ответственность за обработку любой версии лежит на объектах.
Константы перечислений десериализуются иначе, чем обычные сериализуемые или внешние объекты. Сериализованная форма константы перечисления состоит только из ее имени; значения полей константы не передаются. Для десериализации константы перечисления ObjectInputStream считывает имя константы из потока; десериализованная константа затем получается путем вызова статического метода Enum.valueOf(Class, String) с базовым типом константы перечисления и полученным именем константы в качестве аргументов. Как и другие сериализуемые или внешние объекты, константы перечислений могут служить целями обратных ссылок, появляющихся впоследствии в потоке сериализации. Процесс десериализации констант перечисления не может быть настроен: любые методы readObject, readObjectNoData и readResolve, определённые для типов перечислений, игнорируются во время десериализации. Аналогично, любые объявления полей serialPersistentFields или serialVersionUID также игнорируются - все типы перечислений имеют фиксированную serialVersionUID 0L.
- С момента:
- 1.1
- См. также:
-
DataInput,ObjectOutputStream,Serializable, Спецификация сериализации объектов, раздел 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 Конструкторы
| Модификатор | Конструктор | Описание |
|---|---|---|
protected | ObjectInputStream() | Предоставляет способ для подклассов, которые полностью переопределяют ObjectInputStream, чтобы не приходилось выделять частные данные, используемые только этим реализацией ObjectInputStream. |
ObjectInputStream(InputStream in) | Создаёт ObjectInputStream, который читает из указанного InputStream. |
Методы
| Модификатор и тип | Метод | Описание |
|---|---|---|
int | available() | Возвращает количество байтов, которые можно прочитать без блокировки. |
void | close() | Закрывает входной поток. |
void | defaultReadObject() | Читает нестатические и нетранзиентные поля текущего класса из этого потока. |
protected boolean | enableResolveObject(boolean enable) | Разрешает потоку выполнять замену объектов, считанных из потока. |
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-битное целое число. |
Object | readObject() | Читает объект из ObjectInputStream. |
protected Object | readObjectOverride() | Этот метод вызывается доверенными подклассами ObjectOutputStream, которые создали ObjectOutputStream с использованием защищенного конструктора без аргументов. |
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) | Возвращает прокси-класс, реализующий интерфейсы, указанные в описании прокси-класса; подклассы могут реализовать этот метод, чтобы читать пользовательские данные из потока вместе с описаниями для динамических прокси-классов, что позволит им использовать альтернативный механизм загрузки для интерфейсов и прокси-класса. |
void | setObjectInputFilter(ObjectInputFilter filter) | Устанавливает фильтр сериализации для потока. |
int | skipBytes(int len) | Пропускает байты. |
Методы, объявленные в классе java.io.InputStream
mark, markSupported, nullInputStream, read, readAllBytes, readNBytes, readNBytes, reset, skip, 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 не запишет и не осуществит сброс заголовка.
Фильтр сериализации инициализируется значением фильтра процесса.
Если установлен менеджер безопасности, этот конструктор проверит наличие "enableSubclassImplementation" SerializablePermission при вызове напрямую или косвенно конструктором подкласса, который переопределяет методы ObjectInputStream.readFields или ObjectInputStream.readUnshared.
- Параметры:
-
in- входной поток для чтения - Исключения:
-
StreamCorruptedException- если заголовок потока неверный -
IOException- если произошла ошибка ввода/вывода при чтении заголовка потока -
SecurityException- если недоверенный подкласс незаконно переопределяет методы, чувствительные к безопасности -
NullPointerException- еслиinявляетсяnull - См. также:
-
ObjectInputStream(),readFields(),ObjectOutputStream(OutputStream)
ObjectInputStream
protected ObjectInputStream()
throws IOException,
SecurityException Предоставляет способ для подклассов, полностью переопределяющих ObjectInputStream, не выделять приватные данные, используемые только этой реализацией ObjectInputStream.
Фильтр сериализации инициализируется значением фильтра процесса.
Если менеджер безопасности установлен, этот метод сначала вызывает метод менеджера безопасности checkPermission с разрешением SerializablePermission("enableSubclassImplementation"), чтобы убедиться, что разрешено включение подклассов.
- Исключения:
-
SecurityException- если менеджер безопасности существует и его методcheckPermissionзапрещает включение подклассов. -
IOException- если произошла ошибка ввода/вывода при создании этого потока - См. также:
-
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 Этот метод вызывается доверенными подклассами ObjectOutputStream, которые построены с использованием защищенного конструктора без аргументов ObjectOutputStream. Ожидается, что подкласс предоставит метод переопределения с модификатором "final".
- Возвращает:
- объект, прочитанный из потока.
- Бросает:
-
ClassNotFoundException- Определение класса сериализованного объекта не найдено. -
OptionalDataException- В потоке обнаружены примитивные данные вместо объектов. -
IOException- если при чтении из базового потока произошли ошибки ввода/вывода - С:
- 1.2
- См. также:
-
ObjectInputStream(),readObject()
readUnshared
public Object readUnshared()
throws IOException,
ClassNotFoundException Считывает "необщий" объект из ObjectInputStream. Этот метод идентичен readObject, за исключением того, что он предотвращает последующие вызовы readObject и readUnshared от возврата дополнительных ссылок на десериализованный экземпляр, полученный через этот вызов. Конкретно:
- Если readUnshared вызывается для десериализации обратной ссылки (представление в потоке объекта, который был ранее записан в поток), будет брошено исключение ObjectStreamException.
- Если readUnshared успешно возвращает значение, то любые последующие попытки десериализовать обратные ссылки на обработчик потока, десериализованный readUnshared, приведут к возбуждению исключения ObjectStreamException.
Фильтр сериализации, если он не null, вызывается для каждого считанного объекта (обычного или класса) для реконструкции корневого объекта. Подробнее см. setObjectInputFilter.
Подклассы ObjectInputStream, которые переопределяют этот метод, могут быть созданы только в контекстах безопасности, обладающих разрешением SerializablePermission "enableSubclassImplementation"; любая попытка создать такой подкласс без этого разрешения вызовет исключение 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 зарегистрирует объект в потоке, чтобы при восстановлении всех объектов можно было выполнить окончательный набор проверок.
- Параметры:
-
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)
throws SecurityException Включает возможность потоку выполнять замену объектов, считанных из потока. При включении, метод resolveObject(java.lang.Object) вызывается для каждого десериализуемого объекта.
Если замена объекта в данный момент отключена, и enable равно true, и установлено менеджер безопасности, этот метод сначала вызывает метод checkPermission менеджера безопасности с разрешением SerializablePermission("enableSubstitution"), чтобы убедиться, что у вызывающего есть разрешение на включение возможности потока по замене считываемых объектов.
- Параметры:
-
enable- true для включения использованияresolveObjectдля каждого десериализуемого объекта - Возвращает:
- предыдущее значение до вызова этого метода
- Исключение:
-
SecurityException- если менеджер безопасности существует и его методcheckPermissionзапрещает включение возможности потока по замене считываемых объектов. - См. также:
-
SecurityManager.checkPermission(java.security.Permission),SerializablePermission
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 Читает в массив байтов. Этот метод будет блокироваться, пока доступен некоторый ввод. Рассмотрите использование 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-битное целое число типа short.
- Указано в:
-
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 Читает строку, завершенную \n, \r, \r\n или EOF.
- Указано в:
-
readLineв интерфейсеDataInput - Возвращает:
- строку.
- Выбрасывает:
-
IOException- если при чтении из базовогоInputStreamпроизошли ошибки ввода-вывода
readUTF
public String readUTF()
throws IOException Читает строку в формате изменённый UTF-8.
- Указано в:
-
readUTFв интерфейсеDataInput - Возвращает:
- строку.
- Выбрасывает:
-
IOException- если при чтении из базовогоInputStreamпроизошли ошибки ввода-вывода -
UTFDataFormatException- если прочитанные байты не представляют собой действительного кодирования строки в формате изменённый UTF-8
getObjectInputFilter
public final ObjectInputFilter getObjectInputFilter()
Возвращает фильтр сериализации для этого потока. Фильтр сериализации — это последний фильтр, установленный в setObjectInputFilter или начальный фильтр для всего процесса из ObjectInputFilter.Config.getSerialFilter.
- Возвращает:
- фильтр сериализации для потока; может быть null
- С:
- 9
setObjectInputFilter
public final void setObjectInputFilter(ObjectInputFilter filter)
Устанавливает фильтр сериализации для потока. Метод checkInput фильтра вызывается для каждого класса и ссылки в потоке. Фильтр может проверять любой или все из класса, длины массива, числа ссылок, глубины графа и размера входного потока. Глубина — это количество вложенных вызовов readObject, начиная с чтения корня десериализуемого графа и текущего десериализуемого объекта. Число ссылок — это совокупное число объектов и ссылок на объекты, уже прочитанные из потока, включая текущий считываемый объект. Фильтр вызывается только при чтении объектов из потока и не для примитивов.
Если фильтр возвращает Status.REJECTED, null или выбрасывает RuntimeException, активный readObject или readUnshared выбрасывает InvalidClassException, в противном случае десериализация продолжается без перерыва.
Фильтр сериализации инициализируется значением ObjectInputFilter.Config.getSerialFilter при создании ObjectInputStream и может быть установлен в пользовательский фильтр только один раз.
- Требования к реализации:
- Фильтр, когда не
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и не фильтр всего процесса - С:
- 9
© 1993, 2020, 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/11/docs/api/java.base/java/io/ObjectInputStream.html