Класс ObjectInputStream
- Все реализованные интерфейсы:
-
Closeable,DataInput,ObjectInput,ObjectStreamConstants,AutoCloseable
public class ObjectInputStream extends InputStream implements ObjectInput, ObjectStreamConstants
Предупреждение: Десериализация недоверенных данных изначально опасна и должна быть избегаема. Недоверенные данные должны быть тщательно валидированы в соответствии с разделом «Сериализация и десериализация» руководства Secure Coding Guidelines for Java SE. Фильтрация сериализации описывает лучшие практики для защищенного использования фильтров сериализации.
Ключ к отключению атак десериализации заключается в предотвращении десериализации экземпляров произвольных классов, тем самым предотвращая прямое или косвенное выполнение их методов. ObjectInputFilter описывает, как использовать фильтры, а ObjectInputFilter.Config описывает, как настроить фильтр и фабрику фильтров. Каждый поток имеет необязательный фильтр десериализации для проверки классов и лимитов ресурсов во время десериализации. Фабрика фильтров JVM гарантирует, что фильтр может быть установлен на каждый ObjectInputStream, и каждый объект, считанный из потока, может быть проверен. Конструкторы ObjectInputStream вызывают фабрику фильтров для выбора начального фильтра, который может быть обновлен или заменён с помощью setObjectInputFilter(java.io.ObjectInputFilter).
Если у ObjectInputStream есть фильтр, ObjectInputFilter может проверить, разрешены ли классы, длины массивов, количество ссылок в потоке, глубина и количество байтов, потребленных из входного потока, и в противном случае может прервать десериализацию.
ObjectOutputStream и ObjectInputStream могут предоставить приложению постоянное хранилище графов объектов при использовании соответственно с FileOutputStream и FileInputStream. ObjectInputStream используется для восстановления этих ранее сериализованных объектов. Другие применения включают передачу объектов между хостами с использованием потока сокета или для маршаллирования и размаршаллирования аргументов и параметров в системе удалённого взаимодействия.
ObjectInputStream гарантирует, что типы всех объектов в графе, созданном из потока, соответствуют классам, присутствующим в Java Virtual Machine. Классы загружаются по мере необходимости с помощью стандартных механизмов.
Только объекты, поддерживающие интерфейсы java.io.Serializable или java.io.Externalizable, могут быть считаны из потоков.
Метод readObject используется для чтения объекта из потока. Для получения желаемого типа следует использовать безопасное приведение типов Java. В Java строки и массивы являются объектами и обрабатываются как объекты во время сериализации. При чтении их необходимо привести к ожидаемому типу.
Примитивные типы данных могут быть считаны из потока с использованием соответствующего метода в DataInput.
Стандартный механизм десериализации объектов восстанавливает содержимое каждого поля до значения и типа, которые оно имело при записи. Поля, объявленные как transient или static, игнорируются процессом десериализации. Ссылки на другие объекты приводят к чтению этих объектов из потока по мере необходимости. Графы объектов восстанавливаются правильно с помощью механизма совместного использования ссылок. Новые объекты всегда выделяются при десериализации, что предотвращает перезапись существующих объектов.
Чтение объекта аналогично запуску конструкторов нового объекта. Память выделяется для объекта и инициализируется нулём (NULL). Конструкторы без аргументов вызываются для несериализуемых классов, а затем поля сериализуемых классов восстанавливаются из потока, начиная с сериализуемого класса, наиболее близкого к java.lang.object, и заканчивая наиболее специфичным классом объекта.
Например, для чтения из потока, как записано в примере в ObjectOutputStream:
try (FileInputStream fis = new FileInputStream("t.tmp");
ObjectInputStream ois = new ObjectInputStream(fis)) {
String label = (String) ois.readObject();
LocalDateTime dateTime = (LocalDateTime) ois.readObject();
// Use label and dateTime
} catch (Exception ex) {
// handle exception
}
Классы контролируют, как они сериализуются, реализуя либо интерфейсы java.io.Serializable, либо java.io.Externalizable.
Реализация интерфейса Serializable позволяет сериализовать объект, сохраняя всё состояние объекта, и это позволяет классам эволюционировать между временем записи потока и временем его чтения. Он автоматически прослеживает ссылки между объектами, сохраняя и восстанавливая целые графы.
Сериализуемые классы, которые требуют специальной обработки во время сериализации и десериализации, должны реализовывать методы со следующими сигнатурами:
private void writeObject(java.io.ObjectOutputStream stream)
throws IOException;
private void readObject(java.io.ObjectInputStream stream)
throws IOException, ClassNotFoundException;
private void readObjectNoData()
throws ObjectStreamException;
Имя метода, модификаторы, тип возвращаемого значения и количество и типы параметров должны точно совпадать, чтобы метод использовался сериализацией или десериализацией. Методы должны быть объявлены только с выбрасыванием проверочных исключений, согласованных с этими сигнатурами.
Метод readObject отвечает за чтение и восстановление состояния объекта для его конкретного класса с использованием данных, записанных в поток соответствующим методом writeObject. Метод не должен заботиться о состоянии, принадлежащем его суперклассам или подклассам. Состояние восстанавливается путём чтения данных из ObjectInputStream для отдельных полей и присвоения соответствующих полей объекта. Чтение примитивных типов данных поддерживается DataInput.
Любая попытка чтения данных объекта, превышающих границы пользовательских данных, записанных соответствующим методом writeObject, приведёт к выбрасыванию OptionalDataException со значением eof равным true. Необъектные чтения, превышающие конец выделенных данных, отражают конец данных таким же образом, как они указывали бы на конец потока: байтовое чтение вернёт -1 как прочитанный байт или количество прочитанных байтов, а чтение примитивов выбросит EOFExceptions. Если соответствующего метода writeObject нет, то конец стандартных сериализованных данных обозначает конец выделенных данных.
Вызовы чтения примитивов и объектов, выданные внутри метода readExternal, ведут себя одинаково — если поток уже находится в конце данных, записанных соответствующим методом writeExternal, то чтение объектов выбросит OptionalDataExceptions со значением eof, установленным на true, байтовое чтение вернёт -1, а чтение примитивов — EOFExceptions. Обратите внимание, что это поведение не сохраняется для потоков, записанных с использованием старого ObjectStreamConstants.PROTOCOL_VERSION_1 протокола, в котором конец данных, записанных методами writeExternal, не разграничен и, следовательно, не может быть обнаружен.
Метод readObjectNoData отвечает за инициализацию состояния объекта для его конкретного класса в случае, если поток сериализации не указывает данный класс в качестве суперкласса десериализуемого объекта. Это может произойти в случаях, когда принимающая сторона использует другую версию класса десериализованного экземпляра, чем отправляющая сторона, и версия получателя расширяет классы, которые не расширяются версией отправителя. Это также может произойти, если поток сериализации был изменён; следовательно, readObjectNoData полезен для корректной инициализации десериализованных объектов, несмотря на «враждебный» или неполный исходный поток.
Сериализация не читает и не присваивает значения полям любого объекта, не реализующего интерфейс java.io.Serializable. Подклассы объектов, которые не являются сериализуемыми, могут быть сериализуемыми. В этом случае несериализуемый класс должен иметь конструктор без аргументов, чтобы разрешить инициализацию его полей. В этом случае ответственность за сохранение и восстановление состояния несериализуемого класса лежит на подклассе. Часто поля этого класса доступны (public, package или protected) или существуют методы get и set, которые могут быть использованы для восстановления состояния.
Любое исключение, возникающее при десериализации объекта, будет перехвачено ObjectInputStream и прервёт процесс чтения.
Реализация интерфейса Externalizable позволяет объекту полностью контролировать содержимое и формат сериализованной формы объекта. Методы интерфейса Externalizable, writeExternal и readExternal, вызываются для сохранения и восстановления состояния объектов. При реализации классом они могут записывать и считывать собственное состояние, используя все методы ObjectOutput и ObjectInput. Ответственность за обработку любой версии, которая возникает, лежит на объектах.
Постоянные значения перечислений десериализуются иначе, чем обычные сериализуемые или экстернализуемые объекты. Сериализованная форма постоянного значения перечисления состоит только из его имени; значения полей постоянного значения не передаются. Для десериализации постоянного значения перечисления ObjectInputStream считывает имя постоянного значения из потока; десериализованное постоянное значение затем получается вызовом статического метода Enum.valueOf(Class, String) с базовым типом постоянного значения перечисления и полученным именем постоянного значения в качестве аргументов. Как и другие сериализуемые или экстернализуемые объекты, постоянные значения перечислений могут выступать в качестве целей обратных ссылок, появляющихся впоследствии в потоке сериализации. Процесс десериализации постоянных значений перечислений не может быть настраиваемым: все специфичные для класса методы readObject, readObjectNoData и readResolve, определённые типами перечислений, игнорируются во время десериализации. Аналогично, любые объявления полей serialPersistentFields или serialVersionUID также игнорируются — все типы перечислений имеют фиксированное значение serialVersionUID 0L.
Записи сериализуются иначе, чем обычные сериализуемые или экстернализуемые объекты. При десериализации вызывается канонический конструктор записи для построения объекта записи. Некоторые методы, связанные с сериализацией, такие как readObject и writeObject, игнорируются для сериализуемых записей. Смотрите Спецификация сериализации Java объектов, Раздел 1.13, «Сериализация записей» для получения дополнительной информации.
- С:
- 1.1
- Внешние спецификации
- См. также:
Краткое описание вложенных классов
| Модификатор и тип | Класс | Описание |
|---|---|---|
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, который считывает данные из указанного InputStream. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
int |
available() |
Возвращает количество байтов, которые могут быть считаны без блокировки. |
void |
close() |
Закрывает этот входной поток и освобождает все системные ресурсы, связанные с потоком. |
void |
defaultReadObject() |
Считывает нестатические и непеременные поля текущего класса из этого потока. |
protected boolean |
enableResolveObject |
Включает возможность потоку выполнять замену объектов, считанных из потока. |
final ObjectInputFilter |
getObjectInputFilter() |
Возвращает фильтр десериализации для этого потока. |
int |
read() |
Считывает байт данных. |
int |
read |
Считывает данные в массив байтов. |
boolean |
readBoolean() |
Считывает булево значение. |
byte |
readByte() |
Считывает 8-битный байт. |
char |
readChar() |
Считывает 16-битный символ. |
protected ObjectStreamClass |
readClassDescriptor() |
Считывает дескриптор класса из потока сериализации. |
double |
readDouble() |
Считывает 64-битное число с плавающей запятой. |
ObjectInputStream.GetField |
readFields() |
Считывает постоянные поля из потока и делает их доступными по имени. |
float |
readFloat() |
Считывает 32-битное число с плавающей запятой. |
void |
readFully |
Считывает байты, ожидая, пока все байты будут считаны. |
void |
readFully |
Считывает байты, ожидая, пока все байты будут считаны. |
int |
readInt() |
Считывает 32-битное целое число. |
String |
readLine() |
Устаревший. Этот метод не преобразует байты в символы должным образом. |
long |
readLong() |
Считывает 64-битное целое число. |
final Object |
readObject() |
Считывает объект из ObjectInputStream. |
protected Object |
readObjectOverride() |
Этот метод вызывается доверенными подклассами ObjectInputStream, которые построили ObjectInputStream с помощью защищенного конструктора без аргументов. |
short |
readShort() |
Считывает 16-битное короткое целое число. |
protected void |
readStreamHeader() |
Метод readStreamHeader предназначен для того, чтобы подклассы могли считывать и проверять собственные заголовки потока. |
Object |
readUnshared() |
Считывает "необщий" объект из ObjectInputStream. |
int |
readUnsignedByte() |
Считывает беззнаковый 8-битный байт. |
int |
readUnsignedShort() |
Считывает беззнаковый 16-битный короткий. |
String |
readUTF() |
Считывает строку в формате измененного UTF-8. |
void |
registerValidation |
Регистрирует объект, который должен быть проверен перед возвратом графа. |
protected Class |
resolveClass |
Загружает локальный эквивалент указанного дескриптора класса потока. |
protected Object |
resolveObject |
Этот метод позволит доверенным подклассам ObjectInputStream подставить один объект другому во время десериализации. |
protected Class |
resolveProxyClass |
Возвращает класс-прокси, реализующий интерфейсы, указанные в дескрипторе класса-прокси; подклассы могут реализовывать этот метод для считывания пользовательских данных из потока вместе с дескрипторами для динамических классов-прокси, что позволит им использовать альтернативный механизм загрузки для интерфейсов и класса-прокси. |
final void |
setObjectInputFilter |
Устанавливает фильтр десериализации для потока. |
int |
skipBytes |
Пропускает байты. |
Методы, объявленные в классе java.io.InputStream
mark, markSupported, nullInputStream, read, readAllBytes, readNBytes, readNBytes, reset, skip, skipNBytes, transferTo
Методы, объявленные в классе java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Методы, объявленные в интерфейсе java.io.ObjectInput
read, skip
Подробное описание конструкторов
ObjectInputStream
public ObjectInputStream(InputStream in) throws IOException
Конструктор инициализирует фильтр десериализации фильтром, возвращаемым вызовом фабрики фильтра сериализации, полученной из ObjectInputFilter.Config.getSerialFilterFactory() со значением null для текущего фильтра и статическим фильтром JVM для запрошенного фильтра. Если свойства фильтра сериализации или фабрики фильтра сериализации некорректны, будет брошено исключение IllegalStateException. При вызове метода фабрики фильтра apply может быть брошено исключение времени выполнения, что предотвратит создание ObjectInputStream.
Если установлен менеджер безопасности, этот конструктор проверит разрешение SerializablePermission "enableSubclassImplementation" при вызове непосредственно или косвенно конструктором подкласса, который переопределяет методы ObjectInputStream.readFields или ObjectInputStream.readUnshared.
- Параметры:
-
in- поток ввода для чтения - Исключения:
-
StreamCorruptedException- если заголовок потока некорректен -
IOException- если при чтении заголовка потока произошла ошибка ввода/вывода -
SecurityException- если недоверенный подкласс незаконно переопределяет методы, чувствительные к безопасности -
IllegalStateException- если инициализацияObjectInputFilter.Configзавершается неудачно из-за некорректных свойств фильтра сериализации или фабрики фильтра сериализации. -
NullPointerException- еслиinравноnull - См. также:
ObjectInputStream
protected ObjectInputStream() throws IOException, SecurityException
Конструктор инициализирует фильтр десериализации фильтром, возвращаемым вызовом фабрики фильтра сериализации, полученной из ObjectInputFilter.Config.getSerialFilterFactory() со значением null для текущего фильтра и статическим фильтром JVM для запрошенного фильтра. Если свойства фильтра сериализации или фабрики фильтра сериализации некорректны, будет брошено исключение IllegalStateException. При вызове метода фабрики фильтра apply может быть брошено исключение времени выполнения, что предотвратит создание ObjectInputStream.
Если установлен менеджер безопасности, этот метод сначала вызывает метод менеджера безопасности checkPermission с разрешением SerializablePermission("enableSubclassImplementation") для проверки возможности включения подклассов.
- Исключения:
-
SecurityException- если менеджер безопасности существует и его методcheckPermissionотклоняет включение подклассов. -
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
- Parameters:
-
obj- объект, который получит обратный вызов валидации. -
prio- управляет порядком обратных вызовов; ноль — хорошее значение по умолчанию. Используйте большие значения для более раннего вызова обратного вызова, меньшие для более позднего вызова. В пределах приоритета обратные вызовы обрабатываются в произвольном порядке. - Throws:
-
NotActiveException- поток в данный момент не читает объекты, поэтому регистрация обратного вызова невозможна. -
InvalidObjectException- объект валидации равен null.
resolveClass
protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException
Соответствующий метод в ObjectOutputStream — annotateClass. Этот метод будет вызван только один раз для каждого уникального класса в потоке. Этот метод может быть реализован подклассами для использования альтернативного механизма загрузки, но должен вернуть объект Class. После возврата, если класс не является массивом, его serialVersionUID сравнивается с serialVersionUID сериализованного класса, и если есть несоответствие, десериализация завершается неудачно, и выбрасывается InvalidClassException.
Стандартная реализация этого метода в ObjectInputStream возвращает результат вызова
Class.forName(desc.getName(), false, loader)
loader — первый загрузчик классов в стеке текущей нити (начиная с текущего выполняемого метода), который не является загрузчиком платформенных классов и не является его предком; в противном случае, loader — платформенный загрузчик классов. Если этот вызов приводит к ClassNotFoundException и имя переданного экземпляра ObjectStreamClass — ключевое слово языка Java для примитивного типа или void, то будет возвращён объект Class, представляющий этот примитивный тип или void (например, ObjectStreamClass с именем "int" будет разрешён в Integer.TYPE). В противном случае вызывающему методу будет брошено исключение ClassNotFoundException.- Parameters:
-
desc- экземпляр классаObjectStreamClass - Returns:
- объект
Classсоответствующийdesc - Throws:
-
IOException- любые обычные исключения ввода/вывода. -
ClassNotFoundException- если класс сериализованного объекта не может быть найден.
resolveProxyClass
protected Class<?> resolveProxyClass(String[] interfaces) throws IOException, ClassNotFoundException
Этот метод вызывается ровно один раз для каждого уникального описателя класса прокси в потоке.
Соответствующий метод в ObjectOutputStream — annotateProxyClass. Для заданного подкласса ObjectInputStream , переопределяющего этот метод, метод annotateProxyClass в соответствующем подклассе ObjectOutputStream должен записать любые данные или объекты, прочитанные этим методом.
Стандартная реализация этого метода в ObjectInputStream возвращает результат вызова Proxy.getProxyClass со списком объектов Class для интерфейсов, указанных в параметре interfaces. Объект Class для каждого имени интерфейса i — значение, возвращаемое вызовом
Class.forName(i, false, loader)
loader — первый загрузчик классов в стеке текущей нити (начиная с текущего выполняемого метода), который не является загрузчиком платформенных классов и не является его предком; в противном случае, loader — платформенный загрузчик классов. Если ни один из решенных интерфейсов не является непубличным, то это же значение loader также является загрузчиком классов, переданным в Proxy.getProxyClass; если присутствуют непубличные интерфейсы, в качестве загрузчика используется загрузчик класса соответствующего интерфейса (если встречается более одного загрузчика непубличных интерфейсов, выбрасывается IllegalAccessError). Если Proxy.getProxyClass выбрасывает IllegalArgumentException, resolveProxyClass выбросит ClassNotFoundException с IllegalArgumentException.- Parameters:
-
interfaces- список имён интерфейсов, которые были десериализованы в описателе класса прокси - Returns:
- класс прокси для указанных интерфейсов
- Throws:
-
IOException- любое исключение, брошенное базовымInputStream -
ClassNotFoundException- если класс прокси или любой из указанных интерфейсов не найден - Since:
- 1.3
- See Also:
resolveObject
protected Object resolveObject(Object obj) throws IOException
Этот метод вызывается после прочтения объекта, но до возврата его из readObject. Стандартный resolveObject просто возвращает тот же объект.
Когда подкласс заменяет объекты, он должен убедиться, что заменённый объект совместим с каждым полем, где будет храниться ссылка. Объекты, тип которых не является подклассом типа поля или элемента массива, прерывают десериализацию, выбрасывая исключение, и объект не хранится.
Этот метод вызывается только один раз при первом обнаружении каждого объекта. Все последующие ссылки на объект будут перенаправлены на новый объект.
- Parameters:
-
obj- объект, подлежащий замене - Returns:
- заменённый объект
- Throws:
-
IOException- Любые обычные исключения ввода/вывода.
enableResolveObject
protected boolean enableResolveObject(boolean enable) throws SecurityException
resolveObject(java.lang.Object) вызывается для каждого десериализуемого объекта. Если замена объектов в данный момент не включена, и enable равно true, и установлен менеджер безопасности, этот метод сначала вызывает метод менеджера безопасности checkPermission с разрешением SerializablePermission("enableSubstitution") для проверки права вызывающего субъекта на включение замены считываемых из потока объектов.
- Parameters:
-
enable- true для включения использованияresolveObjectдля каждого десериализуемого объекта - Returns:
- предыдущее состояние перед вызовом этого метода
- Throws:
-
SecurityException- если существует менеджер безопасности и его методcheckPermissionзапрещает включение замены считываемых из потока объектов. - See Also:
readStreamHeader
protected void readStreamHeader() throws IOException, StreamCorruptedException
- Throws:
-
IOException- если при чтении из базовогоInputStreamпроизошли ошибки ввода/вывода -
StreamCorruptedException- если управляющая информация в потоке несогласованна
readClassDescriptor
protected ObjectStreamClass readClassDescriptor() throws IOException, ClassNotFoundException
writeClassDescriptor). По умолчанию этот метод читает описания классов в соответствии с форматом, определённым в спецификации сериализации объектов.- Returns:
- прочитанное описание класса
- Throws:
-
IOException- Если произошла ошибка ввода/вывода. -
ClassNotFoundException- Если класс сериализованного объекта, используемого в представлении описания класса, не найден - Since:
- 1.3
- See Also:
read
public int read() throws IOException
- Specified by:
-
readв интерфейсеObjectInput - Specified by:
-
readв классеInputStream - Returns:
- прочитанный байт или -1, если достигнут конец потока.
- Throws:
-
IOException- если произошла ошибка ввода/вывода.
read
public int read(byte[] buf, int off, int len) throws IOException
- Указано в:
-
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-битное короткое целое.
- Исключения:
-
EOFException- Если достигнут конец файла. -
IOException- Если произошла другая ошибка ввода-вывода.
readUnsignedShort
public int readUnsignedShort() throws IOException
- Указано в:
-
readUnsignedShortв интерфейсеDataInput - Возвращает:
- прочитанное 16-битное короткое целое.
- Исключения:
-
EOFException- Если достигнут конец файла. -
IOException- Если произошла другая ошибка ввода-вывода.
readInt
public int readInt() throws IOException
- Указано в:
-
readIntв интерфейсеDataInput - Возвращает:
- прочитанное 32-битное целое.
- Исключения:
-
EOFException- Если достигнут конец файла. -
IOException- Если произошла другая ошибка ввода-вывода.
readLong
public long readLong() throws IOException
- Указано в:
-
readLongв интерфейсеDataInput - Возвращает:
- прочитанное 64-битное длинное целое.
- Исключения:
-
EOFException- Если достигнут конец файла. -
IOException- Если произошла другая ошибка ввода-вывода.
readFloat
public float readFloat() throws IOException
- Указано в:
-
readFloatв интерфейсеDataInput - Возвращает:
- прочитанное 32-битное число с плавающей точкой.
- Исключения:
-
EOFException- Если достигнут конец файла. -
IOException- Если произошла другая ошибка ввода-вывода.
readDouble
public double readDouble() throws IOException
- Указано в:
-
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
- Указано в:
-
readLineв интерфейсеDataInput - Возвращает:
- копию строки в формате String.
- Исключения:
-
IOException- если произошли ошибки ввода-вывода при чтении из базовогоInputStream
readUTF
public String readUTF() throws IOException
- Указано в:
-
readUTFв интерфейсеDataInput - Возвращает:
- строку.
- Исключения:
-
IOException- если произошли ошибки ввода-вывода при чтении из базовогоInputStream -
UTFDataFormatException- если прочитанные байты не представляют собой допустимую кодировку modified UTF-8 строки
getObjectInputFilter
public final ObjectInputFilter getObjectInputFilter()
JVM-wide filter factory либо конструктором конструктором, либо последним вызовом setObjectInputFilter.- Возвращает:
- фильтр десериализации для потока; может быть null
- С версии:
- 9
setObjectInputFilter
public final void setObjectInputFilter(ObjectInputFilter filter)
filter. Текущий фильтр был установлен в конструкторах ObjectInputStream путем вызова глобального фильтра JVM и может быть null. setObjectInputFilter(ObjectInputFilter) Этот метод} может быть вызван один раз и только один раз перед чтением любых объектов из потока; например, вызывая readObject() или readUnshared(). Запрещается заменять non-null фильтр на null фильтр. Если текущий фильтр non-null, значение, возвращаемое фабрикой фильтров, должно быть non-null.
Метод checkInput фильтра вызывается для каждого класса и ссылки в потоке. Фильтр может проверять любой или все из класса, длины массива, количества ссылок, глубины графа и размера входного потока. Глубина — это количество вложенных вызовов readObject, начиная с чтения корня десериализуемого графа и текущего десериализуемого объекта. Количество ссылок — это общее количество объектов и ссылок на объекты, уже прочитанные из потока, включая текущий считываемый объект. Фильтр вызывается только при чтении объектов из потока, а не для примитивов.
Если фильтр возвращает Status.REJECTED, null или выбрасывает RuntimeException, активный readObject или readUnshared выбрасывает InvalidClassException, в противном случае десериализация продолжается без перерывов.
- Требования к реализации:
- Фильтр, когда не
null, вызывается во времяreadObjectиreadUnsharedдля каждого объекта (обычного или класса) в потоке. Строки обрабатываются как примитивы и не вызывают фильтр. Фильтр вызывается для:- каждой ссылки на объект, ранее десериализованный из потока (класс
null, arrayLength — -1), - каждого обычного класса (класс не
null, arrayLength — -1), - каждого класса интерфейса, явно указанного в потоке (для интерфейсов, реализованных классами в потоке, он не вызывается),
- каждого интерфейса динамического прокси и самого класса динамического прокси (класс не
null, arrayLength — -1), - каждого массива, фильтруемого с использованием типа массива и длины массива (класс — тип массива, arrayLength — запрашиваемая длина),
- каждого объекта, замененного методом
readResolveкласса, если неnull, и если это массив, arrayLength, в противном случае — -1, - и каждого объекта, замененного
resolveObject, фильтруемого с использованием класса заменяющего объекта, если неnull, и если это массив, arrayLength, в противном случае — -1.
checkInputему предоставляется доступ к текущему классу, длине массива, текущему количеству ссылок, уже прочитанных из потока, глубине вложенных вызововreadObjectилиreadUnshared, а также реализуемой зависимости от количества байтов, израсходованных из входного потока.Каждый вызов
readObjectилиreadUnsharedувеличивает глубину на 1 перед чтением объекта и уменьшает на 1 перед нормальным или исключительным возвратом. Глубина начинается с1и увеличивается для каждого вложенного объекта, а уменьшается при возвращении каждого вложенного вызова. Количество ссылок в потоке начинается с1и увеличивается перед чтением объекта. - каждой ссылки на объект, ранее десериализованный из потока (класс
- Параметры:
-
filter- фильтр, может быть null - Исключения:
-
SecurityException- если существует менеджер безопасности иSerializablePermission("serialFilter")не предоставлено -
IllegalStateException- если объект уже был прочитан, если фабрика фильтров возвращаетnullпри текущем фильтре, отличном от null, или если фильтр уже был установлен. - С:
- 9
© 1993, 2023, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/io/ObjectInputStream.html