ObjectOutputStream 序列化

返回类型 方法描述
protected void annotateClass(类<?> cl)

子类可以实现此方法,以允许类数据存储在流中。
protected void annotateProxyClass(类<?> cl)

子类可以实现这种方法来存储流中的自定义数据以及动态代理类的描述符。
void close()

关闭流。
void defaultWriteObject()

将当前类的非静态和非瞬态字段写入此流。
protected void drain()

排除ObjectOutputStream中的缓冲数据。
protected boolean enableReplaceObject(boolean enable)

启用流来替换流中的对象。
void flush()

刷新流。
ObjectOutputStream.PutField putFields()

检索用于缓冲要写入流的持久性字段的对象。
protected Object replaceObject(Object obj)

该方法将允许ObjectOutputStream的可信子类在序列化期间将一个对象替换为另一个对象。
void reset()

复位将忽略已写入流的任何对象的状态。
void useProtocolVersion(int version)

指定在编写流时使用的流协议版本。
void write(byte[] buf)

写入一个字节数组。
void write(byte[] buf, int off, int len)

写入一个子字节数组。
void write(int val)

写一个字节。
void writeBoolean(boolean val)

写一个布尔值。
void writeByte(int val)

写入一个8位字节。
void writeBytes(String str)

写一个字符串作为字节序列。
void writeChar(int val)

写一个16位的字符。
void writeChars(String str)

写一个字符串作为一系列的字符。
protected void writeClassDescriptor(ObjectStreamClass desc)

将指定的类描述符写入ObjectOutputStream。
void writeDouble(double val)

写一个64位的双倍。
void writeFields()

将缓冲的字段写入流。
void writeFloat(float val)

写一个32位浮点数。
void writeInt(int val)

写一个32位int。
void writeLong(long val)

写一个64位长
void writeObject(Object obj)

将指定的对象写入ObjectOutputStream。
protected void writeObjectOverride(Object obj)

子类使用的方法来覆盖默认的writeObject方法。
void writeShort(int val)

写一个16位短。
protected void writeStreamHeader()

提供了writeStreamHeader方法,因此子类可以在流中附加或预先添加自己的头。
void writeUnshared(Object obj)

将“非共享”对象写入ObjectOutputStream。
void writeUTF(String str)

此字符串的原始数据写入格式为 modified UTF-8 。




ObjectInputStream 反序列化

返回类型 方法描述
int available()

返回可以读取而不阻塞的字节数。
void close()

关闭输入流。
void defaultReadObject()

从此流读取当前类的非静态和非瞬态字段。
protected boolean enableResolveObject(boolean enable)

启用流以允许从流中读取的对象被替换。
int read()

读取一个字节的数据。
int read(byte[] buf, int off, int len)

读入一个字节数组。
boolean readBoolean()

读取布尔值。
byte readByte()

读取一个8位字节。
char readChar()

读一个16位字符。
protected ObjectStreamClass readClassDescriptor()

从序列化流读取类描述符。
double readDouble()

读64位双倍。
ObjectInputStream.GetField readFields()

从流中读取持久性字段,并通过名称获取它们。
float readFloat()

读32位浮点数。
void readFully(byte[] buf)

读取字节,阻塞直到读取所有字节。
void readFully(byte[] buf, int off, int len)

读取字节,阻塞直到读取所有字节。
int readInt()

读取一个32位int。
String readLine()

已弃用

此方法无法将字节正确转换为字符。 有关详细信息和替代方案,请参阅DataInputStream。
long readLong()

读64位长。
Object readObject()

从ObjectInputStream读取一个对象。
protected Object readObjectOverride()

此方法由ObjectOutputStream的受信任子类调用,该子类使用受保护的无参构造函数构造ObjectOutputStream。
short readShort()

读取16位短。
protected void readStreamHeader()

提供了readStreamHeader方法来允许子类读取和验证自己的流标题。
Object readUnshared()

从ObjectInputStream读取一个“非共享”对象。
int readUnsignedByte()

读取一个无符号的8位字节。
int readUnsignedShort()

读取无符号16位短。
String readUTF()

以 modified UTF-8格式读取字符串。
void registerValidation(ObjectInputValidation obj, int prio)

在返回图之前注册要验证的对象。
protected 类<?> resolveClass(ObjectStreamClass desc)

加载本地类等效的指定流类描述。
protected Object resolveObject(Object obj)

此方法将允许ObjectInputStream的受信任子类在反序列化期间将一个对象替换为另一个对象。
protected 类<?> resolveProxyClass(String[] interfaces)

返回一个代理类,它实现代理类描述符中命名的接口; 子类可以实现此方法从流中读取自定义数据以及动态代理类的描述符,从而允许它们为接口和代理类使用备用加载机制。
int skipBytes(int len)

跳过字节。


示例:

实现序列化对象类User:

public class User implements Serializable {

	private static final long serialVersionUID = 1L;
  
	private String Id;
 
	private String Name;
  
	public User(String Id, String Name) {

		this.Id = Id;
  
		this.Name = Name;
  
	}
  
}

注:
1.Java官方强烈建议所有要序列化的类都显示地声明serialVersionUID字段,
	因为如果高度依赖于JVM默认生成serialVersionUID,
	可能会导致其与编译器的实现细节耦合,
	这样可能会导致在反序列化的过程中发生意外的InvalidClassException异常。

2.serialVersionUID字段地声明使用private关键字修饰,因为该字段只是一个声明

3.数组类是不能显示地声明serialVersionUID的,因为它们始终具有默认计算的值



序列化写入文件:(将User对象作为文本写入磁盘)
  
User user = new User("100", "li");

try {
  
	FileOutputStream filepath = new FileOutputStream("d://user//user.txt");
	
	ObjectOutputStream objectOutputStream = new ObjectOutputStream(filepath);
  
	objectOutputStream.writeObject(user); //写入磁盘
  
	objectOutputStream.close(); //关闭流
  
} catch (IOException e) {
  
	e.printStackTrace(); //在命令行打印异常信息在程序中出错的位置及原因
  
}
  
 
  

反序列化读取文件:(将序列化文件转化为对象)

try {

	FileOutputStream filepath = new FileOutputStream("d://user//user.txt");
	
	ObjectInputStream objectInputStream = new ObjectInputStream(filepath);

	Object object = objectInputStream.readObject();

	User user = (User) object;
	
	System.out.println(user);

}catch(ClassNotFoundException e) {

	e.printStackTrace();

}