Класс 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. Объекты отвечают за обработку любой версии, которая происходит.
Постоянные значения перечислений сериализуются иначе, чем обычные сериализуемые или externalizable объекты. Сериализованная форма постоянного значения перечисления состоит только из его имени; значения полей постоянного значения не передаются. Для сериализации постоянного значения перечисления ObjectOutputStream записывает строку, возвращаемую методом name постоянного значения. Как и другие сериализуемые или externalizable объекты, постоянные значения перечислений могут функционировать как цели обратных ссылок, появляющиеся впоследствии в потоке сериализации. Процесс, в ходе которого сериализуются постоянные значения перечислений, не может быть настроен; любые методы writeObject и writeReplace, специфичные для класса, определенные типами перечислений, игнорируются во время сериализации. Аналогично, любые объявления поля serialPersistentFields или serialVersionUID также игнорируются — все типы перечислений имеют фиксированный serialVersionUID 0L.
Примитивные данные, за исключением сериализуемых полей и внешних данных, записываются в ObjectOutputStream в блоках данных. Блок данных состоит из заголовка и данных. Заголовок блока данных состоит из маркера и количества байтов, следующих за заголовком. Последовательные записи примитивных данных объединяются в один блок данных. Коэффициент блокировки, используемый для записи блока данных, составит 1024 байта. Каждый блок данных будет заполняться до 1024 байт или записываться всякий раз, когда режим записи блока данных прекращается. Вызовы методов ObjectOutputStream writeObject, defaultWriteObject и writeFields первоначально прерывают любой существующий блок данных.
Записи сериализуются иначе, чем обычные сериализуемые или externalizable объекты, см. сериализацию записей.
- С:
- 1.1
- Внешние спецификации
- См. также:
Краткое описание вложенных классов
| Modifier and Type | Class | Description |
|---|---|---|
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
Краткое описание конструкторов
| Modifier | Constructor | Description |
|---|---|---|
protected |
Предоставляет способ для подклассов, полностью переопределяющих ObjectOutputStream, не выделять частные данные, используемые только этой реализацией ObjectOutputStream. |
|
| Создаёт ObjectOutputStream, который записывает данные в указанный OutputStream. |
Краткое описание методов
| Modifier and Type | Method | Description |
|---|---|---|
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-битное значение типа 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. |
Методы, объявленные в классе java.io.OutputStream
nullOutputStream
Подробное описание конструкторов
ObjectOutputStream
public ObjectOutputStream(OutputStream out) throws IOException
Если установлен менеджер безопасности, этот конструктор проверит разрешение SerializablePermission «enableSubclassImplementation» при вызове непосредственно или косвенно конструктором подкласса, который переопределяет методы ObjectOutputStream.putFields или ObjectOutputStream.writeUnshared.
- Параметры:
-
out- поток вывода для записи - Исключения:
-
IOException- если при записи заголовка потока произошла ошибка ввода-вывода -
SecurityException- если недоверенный подкласс незаконно переопределяет методы, чувствительные к безопасности -
NullPointerException- еслиoutявляетсяnull - С тех пор:
- 1.4
- См. также:
ObjectOutputStream
protected ObjectOutputStream() throws IOException, SecurityException
Если установлен менеджер безопасности, этот метод сначала вызывает метод менеджера безопасности checkPermission с разрешением SerializablePermission("enableSubclassImplementation") для проверки возможности разрешения подклассов.
- Исключения:
-
SecurityException- если менеджер безопасности существует и его методcheckPermissionзапрещает разрешение подклассов. -
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.
- 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) throws SecurityException
replaceObject(java.lang.Object) вызывается для каждого сериализуемого объекта. Если замена объектов в данный момент отключена, а enable равно true, и установлен менеджер безопасности, этот метод сначала вызывает метод менеджера безопасности checkPermission с разрешением SerializablePermission("enableSubstitution"), чтобы убедиться, что у вызывающего есть разрешение на включение возможности замены объектов, записываемых в поток.
- Parameters:
-
enable- true для включения использованияreplaceObjectдля каждого сериализуемого объекта - Returns:
- предыдущее значение перед вызовом этого метода
- Throws:
-
SecurityException- если менеджер безопасности существует и его методcheckPermissionзапрещает включение возможности замены объектов, записываемых в поток. - See Also:
writeStreamHeader
protected void writeStreamHeader() throws IOException
- Throws:
-
IOException- если при записи в базовый поток возникли ошибки ввода-вывода
writeClassDescriptor
protected void writeClassDescriptor(ObjectStreamClass desc) throws IOException
readClassDescriptor, должен быть переопределён для восстановления описателя класса из его пользовательского представления в потоке. По умолчанию этот метод записывает описатели классов в соответствии с форматом, определённым в Спецификации сериализации Java-объектов. Обратите внимание, что этот метод будет вызван только в том случае, если ObjectOutputStream не использует старый формат потока сериализации (устанавливается с помощью метода ObjectOutputStream 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- значение символа для записи - Исключения:
-
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, 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/ObjectOutputStream.html