java IO流之对象流ObjectInputStream ObjectInputStream 自定义类 Serializable 序列化与反序列化

本文详细介绍了Java中对象流的使用,包括ObjectOutputStream和ObjectInputStream类的功能,以及如何进行对象的序列化和反序列化操作。重点讲解了序列化和反序列化的过程,以及Serializable接口的作用。同时提到了serialVersionUID在类版本控制中的重要性,并给出了自定义类实例化的序列化和反序列化示例。
摘要由CSDN通过智能技术生成

java IO流之对象流ObjectInputStream ObjectInputStream Serializable

对象流:用于存储和读取基本数据类型数据或对象的处理流。
它的强大之处就是可以把Java中的对象写入到数据源中,也能把对象从数据源中还原回来。

序列化和反序列化:

  • ObjectOutputStream 类 : 把内存中的Java对象转换成平台无关的二进制数据,从而允许把这种二进制数据持久地保存在磁盘上,或通过网络将这种二进制数据传输到另一个网络节点。序列化

  • ObjectInputStream类 : 当其它程序获取了这种二进制数据,就可以恢复成原来的Java对象。反序列化

ObjectOutputStream

  • ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream。可以使用 ObjectInputStream 读取(重构)对象。通过在流中使用文件可以实现对象的持久存储。如果流是网络套接字流,则可以在另一台主机上或另一个进程中重构对象。
  • 只能将支持 java.io.Serializable 接口的对象写入流中。每个 serializable 对象的类都被编码,编码内容包括类名和类签名、对象的字段值和数组值,以及从初始对象中引用的其他所有对象的闭包。
  • writeObject 方法用于将对象写入流中。所有对象(包括 String 和数组)都可以通过 writeObject 写入。可将多个对象或基元写入流中。必须使用与写入对象时相同的类型和顺序从相应 ObjectInputstream 中读回对象。 还可以使用 DataOutput 中的适当方法将基本数据类型写入流中。还可以使用 writeUTF 方法写入字符串。
  • 对象的默认序列化机制写入的内容是:对象的类,类签名,以及非瞬态和非静态字段的值。其他对象的引用(瞬态和静态字段除外)也会导致写入那些对象。可使用引用共享机制对单个对象的多个引用进行编码,这样即可将对象的图形恢复为最初写入它们时的形状。

例如,要写入可通过 ObjectInputStream 中的示例读取的对象,请执行以下操作:

FileOutputStream fos = new FileOutputStream("t.tmp");
ObjectOutputStream oos = new ObjectOutputStream(fos);

oos.writeInt(12345);
oos.writeObject("Today");
oos.writeObject(new Date());

oos.close();
构造方法摘要
  • protected ObjectOutputStream()
    • 为完全重新实现 ObjectOutputStream 的子类提供一种方法,让它不必分配仅由 ObjectOutputStream 的实现使用的私有数据。
  • ObjectOutputStream(OutputStream out)
    • 创建写入指定 OutputStream 的 ObjectOutputStream。

方法

Modifier and Type Method Description
protected void annotateClass(Class<?> cl) 子类可以实现此方法,从而允许在流中存储类数据。
protected void annotateProxyClass(Class<?> cl) 子类可以实现此方法,从而在流中存储定制数据和动态代理类的描述符。
void close() 关闭流。
void defaultWriteObject() 将当前类的非静态和非瞬态字段写入此流。
protected void drain() 排空 ObjectOutputStream 中的所有已缓冲数据。
void flush() 刷新该流的缓冲。
protected Object replaceObject(Object obj) 在序列化期间,此方法允许 ObjectOutputStream 的受信任子类使用一个对象替代另一个对象。
void reset() 重置将丢弃已写入流中的所有对象的状态。
void useProtocolVersion(int version) 指定要在写入流时使用的流协议版本。
void write(byte[] buf) 写入一个 byte 数组。
void write(byte[] buf, int off, int len) 写入字节的子数组。
void write(int val) 写入一个字节。
void writeBoolean(boolean val) 写入一个 boolean 值。
void writeByte(int val) 写入一个 8 位字节。
void writeBytes(String str) 以字节序列形式写入一个 String。
void writeChar(int val) 写入一个 16 位的 char 值。
void writeChars(String str) 以 char 序列形式写入一个 String。
void writeDouble(double val) 写入一个 64 位的 double 值。
void writeFields() 将已缓冲的字段写入流中。
void writeFloat(float val) 写入一个 32 位的 float 值。
void writeInt(int val) 写入一个 32 位的 int 值。
void writeLong(long val) 写入一个 64 位的 long 值。
void writeObject(Object obj) 将指定的对象写入 ObjectOutputStream。
protected void writeObjectOverride(Object obj) 子类用于重写默认 writeObject 方法的方法。
void writeShort(int val) 写入一个 16 位的 short 值。
protected void writeStreamHeader() 提供 writeStreamHeader 方法,这样子类可以将其自身的头部添加或预加到流中。
void writeUnshared(Object obj) 将“未共享”对象写入 ObjectOutputStream。
void writeUTF(String str) 以 UTF-8 修改版格式写入此 String 的基本数据。
  • protected boolean enableReplaceObject(boolean enable) 允许流对流中的对象进行替换。

  • protected void writeClassDescriptor (ObjectStreamClass desc) 将指定的类描述符写入 ObjectOutputStream。

  • ObjectOutputStream.PutField putFields() 获取用于缓冲写入流中的持久存储字段的对象。

  • 从类 java.lang.Object 继承的方法clone, equals, finalize, getCl
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SK Primin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值