Класс ObjectOutputStream
- Все реализованные интерфейсы:
-
Closeable,DataOutput,Flushable,ObjectOutput,ObjectStreamConstants,AutoCloseable
public class ObjectOutputStream extends OutputStream implements ObjectOutput, ObjectStreamConstants
Только объекты, поддерживающие интерфейс java.io.Serializable, могут быть записаны в потоки. Класс каждого сериализуемого объекта кодируется, включая имя класса и сигнатуру класса, значения полей и массивов объекта, а также замыкание любых других объектов, на которые ссылаются исходные объекты.
Для записи объекта в поток используется метод writeObject. Любой объект, включая строки и массивы, записывается с помощью writeObject. В поток можно записать несколько объектов или примитивные данные. Объекты должны быть считаны обратно из соответствующего ObjectInputStream с теми же типами и в том же порядке, в котором они были записаны.
Примитивные типы данных также могут быть записаны в поток с помощью соответствующих методов из DataOutput. Строки также могут быть записаны с помощью метода writeUTF.
Механизм сериализации по умолчанию для объекта записывает класс объекта, сигнатуру класса и значения всех не-transient и не-static полей. Ссылки на другие объекты (кроме transient или static полей) также вызывают запись этих объектов. Многократные ссылки на один объект кодируются с использованием механизма совместного использования ссылок, чтобы графы объектов можно было восстановить в том же виде, что и при записи оригинала.
Например, чтобы записать объект, который можно прочитать с помощью примера в 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
}
Классы Serializable, которые требуют специальной обработки во время сериализации и десериализации, должны реализовывать методы со следующими сигнатурами:
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. Объекты несут ответственность за обработку любой версии, которая происходит.
Постоянные значения перечислений сериализуются иначе, чем обычные сериализуемые или внешне сериализуемые объекты. Сериализованная форма константы перечисления состоит только из ее имени; значения полей константы не передаются. Для сериализации константы перечисления ObjectOutputStream записывает строку, возвращаемую методом name константы. Как и другие сериализуемые или внешне сериализуемые объекты, константы перечисления могут выполнять роль целей обратных ссылок, появляющихся впоследствии в потоке сериализации. Процесс сериализации констант перечисления не может быть настроен; любые специфичные для класса методы writeObject и writeReplace, определенные типами перечислений, игнорируются во время сериализации. Аналогично, любые объявления поля serialPersistentFields или serialVersionUID также игнорируются — все типы перечислений имеют фиксированное serialVersionUID 0L.
Примитивные данные, за исключением сериализуемых полей и внешне сериализуемых данных, записываются в ObjectOutputStream в блоках данных. Блок данных состоит из заголовка и данных. Заголовок блока данных состоит из маркера и количества байтов, которые будут следовать за заголовком. Последовательные записи примитивных данных объединяются в один блок данных. Коэффициент блоков, используемый для блока данных, будет 1024 байт. Каждый блок данных будет заполнен до 1024 байт или будет записан всякий раз, когда происходит завершение режима блоков данных. Вызовы методов ObjectOutputStream writeObject, defaultWriteObject и writeFields первоначально завершают любой существующий блок данных.
Записи сериализуются иначе, чем обычные сериализуемые или внешне сериализуемые объекты, см. сериализацию записей.
- С:
- 1.1
- Внешние спецификации
- См. также:
Краткое описание вложенных классов
| Модификатор и тип | Класс | Описание |
|---|---|---|
static class |
ObjectOutputStream.PutField |
Предоставляет программный доступ к постоянным полям, которые будут записаны в ObjectOutput. |
Краткое описание полей
Поля, объявленные в интерфейсе 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 |
Предоставляет способ для подклассов, полностью переопределяющих 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() |
Сброс проигнорирует состояние любых объектов, уже записанных в поток. |
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-битовое значение с плавающей запятой двойной точности. |
void |
writeFields() |
Записывает буферизованные поля в поток. |
void |
writeFloat |
Записывает 32-битовое значение с плавающей запятой одинарной точности. |
void |
writeInt |
Записывает 32-битовое целое число. |
void |
writeLong |
Записывает 64-битовое целое число. |
final void |
writeObject |
Записывает указанный объект в ObjectOutputStream. |
protected void |
writeObjectOverride |
Метод, используемый подклассами для переопределения метода writeObject по умолчанию. |
void |
writeShort |
Записывает 16-битовое короткое целое число. |
protected void |
writeStreamHeader() |
Метод writeStreamHeader предоставляется для того, чтобы подклассы могли добавлять или вставлять собственные заголовки в поток. |
void |
writeUnshared |
Записывает "непостоянный" объект в ObjectOutputStream. |
void |
writeUTF |
Запись примитивных данных этой строки в формате измененного UTF-8. |
Методы, объявленные в классе java.io.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- версия протокола из 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.
- Parameters:
-
cl- класс прокси, для которого нужно добавить пользовательские данные - Throws:
-
IOException- любое исключение, сгенерированное базовымOutputStream - Since:
- 1.3
- See Also:
replaceObject
protected Object replaceObject(Object obj) throws IOException
Метод ObjectOutputStream.writeObject принимает параметр типа Object (вместо Serializable), чтобы позволить случаи, когда несериализуемые объекты заменяются сериализуемыми.
Когда подкласс заменяет объекты, он должен гарантировать, что либо будет произведена дополнительная подмена во время десериализации, либо что замененный объект совместим с каждым полем, где будет храниться ссылка. Объекты, тип которых не является подклассом типа поля или элемента массива, прерывают сериализацию, вызывая исключение, и объект не сохраняется.
Этот метод вызывается только один раз при первом обнаружении объекта. Все последующие ссылки на объект будут перенаправлены на новый объект. Этот метод должен вернуть подлежащий замене объект или исходный объект.
Возврат null в качестве заменяемого объекта может вызвать NullPointerException в классах, содержащих ссылки на исходный объект, поскольку они могут ожидать объект вместо null.
- Parameters:
-
obj- объект, который нужно заменить - Returns:
- альтернативный объект, заменивший указанный
- Throws:
-
IOException- Любое исключение, сгенерированное базовым потоком OutputStream.
enableReplaceObject
protected boolean enableReplaceObject(boolean enable)
replaceObject(java.lang.Object) вызывается для каждого сериализуемого объекта.- Parameters:
-
enable- true для включения заменыreplaceObjectдля каждого сериализуемого объекта - Returns:
- предыдущее значение до вызова этого метода
writeStreamHeader
protected void writeStreamHeader() throws IOException
- Throws:
-
IOException- если при записи в базовый поток произошли ошибки ввода-вывода
writeClassDescriptor
protected void writeClassDescriptor(ObjectStreamClass desc) throws IOException
readClassDescriptor, должен быть переопределен для восстановления дескриптора класса из его представления в потоке. По умолчанию этот метод записывает дескрипторы классов в соответствии с форматом, определенным в Спецификации сериализации Java-объектов. Обратите внимание, что этот метод будет вызван только если ObjectOutputStream не использует старый формат потока сериализации (установленный вызовом метода ObjectOutputStream's useProtocolVersion). Если этот поток сериализации использует старый формат (PROTOCOL_VERSION_1), дескриптор класса будет записан внутренне способом, который нельзя переопределить или настроить.
- Parameters:
-
desc- дескриптор класса, который нужно записать в поток - Throws:
-
IOException- Если произошла ошибка ввода-вывода. - Since:
- 1.3
- External Specifications
- See Also:
write
public void write(int val) throws IOException
- Specified by:
-
writeв интерфейсеDataOutput - Specified by:
-
writeв интерфейсеObjectOutput - Specified by:
-
writeв классеOutputStream - Parameters:
-
val- байт, который нужно записать в поток - Throws:
-
IOException- Если произошла ошибка ввода-вывода.
write
public void write(byte[] buf) throws IOException
- Specified by:
-
writeв интерфейсеDataOutput - Specified by:
-
writeв интерфейсеObjectOutput - Overrides:
-
writeв классеOutputStream - Parameters:
-
buf- данные для записи - Throws:
-
IOException- Если произошла ошибка ввода-вывода. - See Also:
write
public void write(byte[] buf, int off, int len) throws IOException
- Specified by:
-
writeв интерфейсеDataOutput - Specified by:
-
writeв интерфейсеObjectOutput - Overrides:
-
writeв классеOutputStream - Parameters:
-
buf- данные для записи -
off- начальный смещение в данных -
len- количество записываемых байтов - Throws:
-
IOException- если произошла ошибка ввода-вывода. В частности, бросаетсяIOException, если поток вывода закрыт. -
IndexOutOfBoundsException- Еслиoffотрицательно,lenотрицательно илиlenбольше, чемb.length - off
flush
public void flush() throws IOException
- Specified by:
-
flushв интерфейсеFlushable - Specified by:
-
flushв интерфейсеObjectOutput - Overrides:
-
flushв классеOutputStream - Throws:
-
IOException- если произошла ошибка ввода-вывода.
drain
protected void drain() throws IOException
- Throws:
-
IOException- если произошли ошибки ввода-вывода при записи в базовый поток
close
public void close() throws IOException
- Specified by:
-
closeв интерфейсеAutoCloseable - Specified by:
-
closeв интерфейсеCloseable - Specified by:
-
closeв интерфейсеObjectOutput - Overrides:
-
closeв классеOutputStream - Throws:
-
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- значение char для записи - Исключения:
-
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- значение числа с плавающей точкой для записи - Исключения:
-
IOException- если при записи в базовый поток возникают ошибки ввода-вывода
writeDouble
public void writeDouble(double val) throws IOException
- Указано в:
-
writeDoubleв интерфейсеDataOutput - Параметры:
-
val- значение числа с двойной точностью для записи - Исключения:
-
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://download.java.net/java/early_access/jdk24/docs/api/java.base/java/io/ObjectOutputStream.html