Класс ObjectOutputStream
- Все реализуемые интерфейсы:
Closeable, DataOutput, Flushable, ObjectOutput, ObjectStreamConstants, AutoCloseable
public class ObjectOutputStream extends OutputStream implements ObjectOutput, ObjectStreamConstants
В потоки можно записывать только объекты, поддерживающие интерфейс java.io.Serializable. Кодируется класс каждого сериализуемого объекта, включая имя и сигнатуру класса, значения полей и массивов объекта, а также все другие объекты, на которые ссылаются исходные объекты.
Для записи объекта в поток используется метод writeObject. С помощью writeObject записывается любой объект, в том числе строки и массивы. В поток можно записать несколько объектов или примитивных значений. Объекты необходимо считывать из соответствующего ObjectInputstream в том же порядке и с теми же типами, с которыми они были записаны.
Примитивные типы данных также можно записывать в поток с помощью соответствующих методов из DataOutput. Строки можно записывать с помощью метода writeUTF.
Механизм сериализации объекта по умолчанию записывает класс объекта, сигнатуру класса и значения всех непреходящих и нестатических полей. Ссылки на другие объекты (за исключением ссылок в преходящих или статических полях) также приводят к записи этих объектов. Множественные ссылки на один объект кодируются с помощью механизма совместного использования ссылок, благодаря чему графы объектов можно восстановить в том же виде, в каком они были записаны.
Например, чтобы записать объект, который можно прочитать с помощью примера из ObjectInputStream:
try (FileOutputStream fos = new FileOutputStream("t.tmp");
ObjectOutputStream oos = new ObjectOutputStream(fos)) {
oos.writeObject("Today");
oos.writeObject(LocalDateTime.now());
} catch (Exception ex) {
// handle exception
}
Сериализуемые классы, требующие специальной обработки в процессе сериализации и десериализации, должны реализовать методы со следующими сигнатурами:
private void readObject(java.io.ObjectInputStream stream)
throws IOException, ClassNotFoundException;
private void writeObject(java.io.ObjectOutputStream stream)
throws IOException;
private void readObjectNoData()
throws ObjectStreamException;
Чтобы метод использовался при сериализации или десериализации, его имя, модификаторы, тип возвращаемого значения, количество и тип параметров должны в точности совпадать. Методы должны объявлять только проверяемые исключения, соответствующие этим сигнатурам.
Метод writeObject отвечает за запись состояния объекта для конкретного класса, чтобы соответствующий метод readObject мог его восстановить. Метод не должен обрабатывать состояние, принадлежащее суперклассам или подклассам объекта. Состояние сохраняется путем записи отдельных полей в ObjectOutputStream с помощью метода writeObject или методов для примитивных типов данных, поддерживаемых DataOutput.
При сериализации не записываются поля объектов, не реализующих интерфейс java.io.Serializable. Подклассы объектов, не поддерживающих сериализацию, могут быть сериализуемыми. В этом случае у несериализуемого класса должен быть конструктор без аргументов, позволяющий инициализировать его поля. В таком случае подкласс отвечает за сохранение и восстановление состояния несериализуемого класса. Часто поля этого класса доступны (public, package или protected) либо существуют методы get и set, с помощью которых можно восстановить состояние.
Сериализацию объекта можно запретить, реализовав методы writeObject и readObject, выбрасывающие NotSerializableException. ObjectOutputStream перехватит это исключение и прервет процесс сериализации.
Реализация интерфейса Externalizable позволяет объекту полностью управлять содержимым и форматом его сериализованного представления. Методы интерфейса Externalizable — writeExternal и readExternal — вызываются для сохранения и восстановления состояния объектов. Реализующий их класс может записывать и считывать собственное состояние с помощью всех методов ObjectOutput и ObjectInput. Объекты отвечают за обработку любых изменений версий.
Константы перечислений сериализуются иначе, чем обычные сериализуемые объекты и объекты Externalizable. Сериализованное представление константы перечисления состоит только из ее имени; значения полей константы не передаются. Для сериализации константы перечисления ObjectOutputStream записывает строку, возвращаемую методом name этой константы. Как и другие сериализуемые объекты или объекты Externalizable, константы перечислений могут быть целями обратных ссылок, встречающихся далее в потоке сериализации. Процесс сериализации констант перечислений нельзя настроить; любые методы writeObject и writeReplace, определенные для конкретного класса перечисления, при сериализации игнорируются. Аналогично игнорируются объявления полей serialPersistentFields и serialVersionUID — для всех типов перечислений задано фиксированное значение serialVersionUID, равное 0L.
Примитивные данные, за исключением сериализуемых полей и данных Externalizable, записываются в ObjectOutputStream в виде блоков данных. Блок данных состоит из заголовка и данных. Заголовок блока данных включает маркер и количество следующих за ним байтов. Последовательные записи примитивных данных объединяются в один блок данных. Размер блока данных составляет 1024 байта. Каждый блок данных заполняется до 1024 байт или записывается при завершении режима блоков данных. Вызовы методов ObjectOutputStream writeObject, defaultWriteObject и writeFields сначала завершают любой существующий блок данных.
Записи сериализуются иначе, чем обычные сериализуемые объекты и объекты Externalizable; см. раздел сериализация записей.
- Начиная с версии:
- 1.1
- Внешние спецификации
- См. также:
Краткое описание вложенных классов
| Модификатор и тип | Класс | Описание |
|---|---|---|
static class |
ObjectOutputStream.PutField |
Предоставляет программный доступ к постоянным полям, которые будут записаны в ObjectOutput. |
Краткое описание полей
Поля, объявленные в интерфейсе 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 |
Предоставляет подклассам, полностью переопределяющим ObjectOutputStream, возможность не выделять память под закрытые данные, используемые только этой реализацией ObjectOutputStream. |
|
| Создает ObjectOutputStream, выполняющий запись в указанный OutputStream. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
protected void |
annotateClass |
Подклассы могут реализовать этот метод, чтобы сохранять данные класса в потоке. |
protected void |
annotateProxyClass |
Подклассы могут реализовать этот метод, чтобы сохранять в потоке пользовательские данные вместе с дескрипторами классов динамических прокси. |
void |
close() |
Закрывает поток. |
void |
defaultWriteObject() |
Записывает в этот поток нестатические и непреходящие поля текущего класса. |
protected void |
drain() |
Записывает все буферизованные данные в ObjectOutputStream. |
protected boolean |
enableReplaceObject |
Позволяет потоку заменять объекты, записываемые в поток. |
void |
flush() |
Сбрасывает данные потока. |
ObjectOutputStream.PutField |
putFields() |
Возвращает объект, используемый для буферизации постоянных полей, которые необходимо записать в поток. |
protected Object |
replaceObject |
Этот метод позволяет доверенным подклассам ObjectOutputStream заменять один объект другим во время сериализации. |
void |
reset() |
Метод reset игнорирует состояние всех объектов, уже записанных в поток. |
void |
useProtocolVersion |
Задает версию протокола потока, используемую при его записи. |
void |
write |
Записывает массив байтов. |
void |
write |
Записывает часть массива байтов. |
void |
write |
Записывает байт. |
void |
writeBoolean |
Записывает логическое значение. |
void |
writeByte |
Записывает 8-битный байт. |
void |
writeBytes |
Записывает строку в виде последовательности байтов. |
void |
writeChar |
Записывает 16-битный символ. |
void |
writeChars |
Записывает строку в виде последовательности символов. |
protected void |
writeClassDescriptor |
Записывает указанный дескриптор класса в ObjectOutputStream. |
void |
writeDouble |
Записывает 64-битное значение типа double. |
void |
writeFields() |
Записывает буферизованные поля в поток. |
void |
writeFloat |
Записывает 32-битное значение типа float. |
void |
writeInt |
Записывает 32-битное значение типа int. |
void |
writeLong |
Записывает 64-битное значение типа long. |
final void |
writeObject |
Записывает указанный объект в ObjectOutputStream. |
protected void |
writeObjectOverride |
Метод, используемый подклассами для переопределения метода writeObject по умолчанию. |
void |
writeShort |
Записывает 16-битное значение типа short. |
protected void |
writeStreamHeader() |
Метод writeStreamHeader предоставлен для того, чтобы подклассы могли добавлять собственный заголовок в начало или конец потока. |
void |
writeUnshared |
Записывает в ObjectOutputStream объект без совместного использования. |
void |
writeUTF |
Записывает примитивные данные этой строки в формате модифицированного UTF-8. |
Методы, объявленные в классе OutputStream
nullOutputStream
Подробное описание конструкторов
ObjectOutputStream
public ObjectOutputStream(OutputStream out) throws IOException
- Параметры:
-
out- выходной поток для записи - Исключения:
-
IOException- если при записи заголовка потока произошла ошибка ввода-вывода -
NullPointerException- еслиoutимеет значениеnull - С момента:
- 1.4
- См. также:
ObjectOutputStream
protected ObjectOutputStream() throws IOException
- Исключения:
-
IOException- если при создании этого потока произошла ошибка ввода-вывода
Подробное описание методов
useProtocolVersion
public void useProtocolVersion(int version) throws IOException
Этот метод предоставляет точку расширения, позволяющую текущей версии механизма сериализации записывать данные в формате, обратно совместимом с предыдущей версией формата потока.
Будут предприняты все усилия, чтобы избежать появления дополнительных несовместимостей с предыдущими версиями; однако иногда другого решения нет.
- Параметры:
-
version- используйте ProtocolVersion из java.io.ObjectStreamConstants. - Исключения:
-
IllegalStateException- если вызван после сериализации каких-либо объектов. -
IllegalArgumentException- если передана недопустимая версия. -
IOException- если произошли ошибки ввода-вывода - С момента:
- 1.2
- См. также:
writeObject
public final void writeObject(Object obj) throws IOException
Исключения возникают при проблемах с OutputStream и для классов, которые не следует сериализовать. Все исключения являются фатальными для OutputStream, который остается в неопределенном состоянии; вызывающий метод должен самостоятельно проигнорировать состояние потока или восстановить его.
- Определено в:
-
writeObjectв интерфейсеObjectOutput - Параметры:
-
obj- объект для записи - Исключения:
-
InvalidClassException- проблема с классом, используемым при сериализации. -
NotSerializableException- какой-либо сериализуемый объект не реализует интерфейс java.io.Serializable. -
IOException- любое исключение, возникшее в базовом OutputStream.
writeObjectOverride
protected void writeObjectOverride(Object obj) throws IOException
- Параметры:
-
obj- объект для записи в базовый поток - Исключения:
-
IOException- если при записи в базовый поток произошли ошибки ввода-вывода - С момента:
- 1.2
- См. также:
defaultWriteObject
public void defaultWriteObject() throws IOException
- Исключения:
-
IOException- если при записи в базовыйOutputStreamпроизошли ошибки ввода-вывода
putFields
public ObjectOutputStream.PutField putFields() throws IOException
- Возвращает:
- экземпляр класса Putfield, содержащий сериализуемые поля
- Исключения:
-
IOException- если произошли ошибки ввода-вывода - С момента:
- 1.2
writeFields
public void writeFields() throws IOException
- Исключения:
-
IOException- если при записи в базовый поток произошли ошибки ввода-вывода -
NotActiveException- вызывается, если метод writeObject класса не был вызван для записи состояния объекта. - С момента:
- 1.2
reset
public void reset() throws IOException
- Исключения:
-
IOException- если reset() вызван во время сериализации объекта.
annotateClass
protected void annotateClass(Class<?> cl) throws IOException
- Параметры:
-
cl- класс, для которого следует добавить пользовательские данные - Исключения:
-
IOException- любое исключение, возникшее в базовом OutputStream.
annotateProxyClass
protected void annotateProxyClass(Class<?> cl) throws IOException
Этот метод вызывается ровно один раз для каждого уникального дескриптора прокси-класса в потоке. Реализация этого метода по умолчанию в ObjectOutputStream ничего не делает.
Соответствующий метод в ObjectInputStream — resolveProxyClass. Для заданного подкласса ObjectOutputStream, переопределяющего этот метод, метод resolveProxyClass соответствующего подкласса ObjectInputStream должен считывать любые данные или объекты, записанные методом annotateProxyClass.
- Параметры:
-
cl- прокси-класс, для которого следует добавить пользовательские данные - Исключения:
-
IOException- любое исключение, возникшее в базовомOutputStream - С момента:
- 1.3
- См. также:
replaceObject
protected Object replaceObject(Object obj) throws IOException
Метод ObjectOutputStream.writeObject принимает параметр типа Object (а не Serializable), чтобы можно было заменять несериализуемые объекты сериализуемыми.
При подмене объектов подкласс должен обеспечить либо выполнение соответствующей подмены при десериализации, либо совместимость подставленного объекта с каждым полем, в котором будет храниться ссылка. Объекты, тип которых не является подтипом типа поля или элемента массива, прерывают сериализацию с выбросом исключения и не сохраняются.
Этот метод вызывается только один раз при первом обнаружении каждого объекта. Все последующие ссылки на объект будут перенаправлены на новый объект. Этот метод должен возвращать объект, которым следует заменить исходный, либо исходный объект.
В качестве объекта для подмены можно вернуть null, однако это может привести к возникновению NullPointerException в классах, содержащих ссылки на исходный объект, если они ожидают объект, а не null.
- Параметры:
-
obj- объект для замены - Возвращает:
- альтернативный объект, заменивший указанный объект
- Исключения:
-
IOException- любое исключение, возникшее в базовом OutputStream.
enableReplaceObject
protected boolean enableReplaceObject(boolean enable)
replaceObject(Object) вызывается для каждого сериализуемого объекта.- Параметры:
-
enable- true, чтобы разрешить использованиеreplaceObjectдля каждого сериализуемого объекта - Возвращает:
- предыдущее значение настройки перед вызовом этого метода
writeStreamHeader
protected void writeStreamHeader() throws IOException
- Исключения:
-
IOException- если при записи в базовый поток произошли ошибки ввода-вывода
writeClassDescriptor
protected void writeClassDescriptor(ObjectStreamClass desc) throws IOException
readClassDescriptor, — чтобы восстановить дескриптор класса из его пользовательского представления в потоке. По умолчанию этот метод записывает дескрипторы классов в соответствии с форматом, определенным в Спецификации сериализации объектов Java. Обратите внимание, что этот метод вызывается только в том случае, если ObjectOutputStream не использует старый формат потока сериализации (который устанавливается вызовом метода useProtocolVersion класса ObjectOutputStream). Если в этом потоке сериализации используется старый формат (PROTOCOL_VERSION_1), дескриптор класса будет записан внутренним способом, который нельзя переопределить или настроить.
- Параметры:
-
desc- дескриптор класса для записи в поток - Исключения:
-
IOException- если произошла ошибка ввода-вывода. - С момента:
- 1.3
- Внешние спецификации
- См. также:
write
public void write(int val) throws IOException
- Определено в:
-
writeв интерфейсеDataOutput - Определено в:
-
writeв интерфейсеObjectOutput - Определено в:
-
writeв классеOutputStream - Параметры:
-
val- байт для записи в поток - Исключения:
-
IOException- если произошла ошибка ввода-вывода.
write
public void write(byte[] buf) throws IOException
- Определено в:
-
writeв интерфейсеDataOutput - Определено в:
-
writeв интерфейсеObjectOutput - Переопределяет:
-
writeв классеOutputStream - Параметры:
-
buf- записываемые данные - Исключения:
-
IOException- если произошла ошибка ввода-вывода. - См. также:
write
public void write(byte[] buf, int off, int len) throws IOException
- Определено в:
-
writeв интерфейсеDataOutput - Определено в:
-
writeв интерфейсеObjectOutput - Переопределяет:
-
writeв классеOutputStream - Параметры:
-
buf- записываемые данные -
off- начальное смещение в данных -
len- количество записываемых байтов - Исключения:
-
IOException- если произошла ошибка ввода-вывода. В частности, выбрасываетсяIOException, если выходной поток закрыт. -
IndexOutOfBoundsException- еслиoffотрицательно,lenотрицательно илиlenбольшеb.length - off
flush
public void flush() throws IOException
- Определено в:
-
flushв интерфейсеFlushable - Определено в:
-
flushв интерфейсеObjectOutput - Переопределяет:
-
flushв классеOutputStream - Исключения:
-
IOException- если произошла ошибка ввода-вывода.
drain
protected void drain() throws IOException
- Исключения:
-
IOException- если при записи в базовый поток произошли ошибки ввода-вывода
close
public void close() throws IOException
- Определено в:
-
closeв интерфейсеAutoCloseable - Определено в:
-
closeв интерфейсеCloseable - Определено в:
-
closeв интерфейсеObjectOutput - Переопределяет:
-
closeв классеOutputStream - Исключения:
-
IOException- если произошла ошибка ввода-вывода.
writeBoolean
public void writeBoolean(boolean val) throws IOException
- Определено в:
-
writeBooleanв интерфейсеDataOutput - Параметры:
-
val- записываемое логическое значение - Исключения:
-
IOException- если при записи в базовый поток произошли ошибки ввода-вывода
writeByte
public void writeByte(int val) throws IOException
- Определено в:
-
writeByteв интерфейсеDataOutput - Параметры:
-
val- записываемое значение байта - Исключения:
-
IOException- если при записи в базовый поток произошли ошибки ввода-вывода
writeShort
public void writeShort(int val) throws IOException
- Определено в:
-
writeShortв интерфейсеDataOutput - Параметры:
-
val- записываемое короткое целое значение - Исключения:
-
IOException- если при записи в базовый поток произошли ошибки ввода-вывода
writeChar
public void writeChar(int val) throws IOException
- Определено в:
-
writeCharв интерфейсеDataOutput - Параметры:
-
val- записываемое значение символа - Исключения:
-
IOException- если при записи в базовый поток произошли ошибки ввода-вывода
writeInt
public void writeInt(int val) throws IOException
- Определено в:
-
writeIntв интерфейсеDataOutput - Параметры:
-
val- записываемое целочисленное значение - Исключения:
-
IOException- если при записи в базовый поток произошли ошибки ввода-вывода
writeLong
public void writeLong(long val) throws IOException
- Определено в:
-
writeLongв интерфейсеDataOutput - Параметры:
-
val- записываемое длинное целое значение - Исключения:
-
IOException- если при записи в базовый поток произошли ошибки ввода-вывода
writeFloat
public void writeFloat(float val) throws IOException
- Определено в:
-
writeFloatв интерфейсеDataOutput - Параметры:
-
val- записываемое значение типа float - Исключения:
-
IOException- если при записи в базовый поток произошли ошибки ввода-вывода
writeDouble
public void writeDouble(double val) throws IOException
- Определено в:
-
writeDoubleв интерфейсеDataOutput - Параметры:
-
val- записываемое значение типа double - Исключения:
-
IOException- если при записи в базовый поток произошли ошибки ввода-вывода
writeBytes
public void writeBytes(String str) throws IOException
- Определено в:
-
writeBytesв интерфейсеDataOutput - Параметры:
-
str- строка байтов для записи - Исключения:
-
IOException- если при записи в базовый поток произошли ошибки ввода-вывода
writeChars
public void writeChars(String str) throws IOException
- Определено в:
-
writeCharsв интерфейсеDataOutput - Параметры:
-
str- строка символов для записи - Исключения:
-
IOException- если при записи в базовый поток произошли ошибки ввода-вывода
writeUTF
public void writeUTF(String str) throws IOException
- Определено в:
-
writeUTFв интерфейсеDataOutput - Параметры:
-
str- строка для записи - Исключения:
-
IOException- если при записи в базовый поток произошли ошибки ввода-вывода
© 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.
https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/io/ObjectOutputStream.html