对象操作流

实现对象的序列化(对象转换为字节序列的过程)和反序列化(字节序列恢复为Java对象的过程),达到网络传输、本地存储的目的。

仅支持实现java.io.Serializable或java.io.Externalizable接口的对象使用。

ObjectInputStream

public class ObjectInputStream
extends InputStream
implements ObjectInput, ObjectStreamConstants

 

实现的接口

Closeable , DataInput , ObjectInput , ObjectStreamConstants , AutoCloseable 

 

部分方法

变量和类型方法描述
int available()
返回可以不阻塞地读取的字节数。
void close()
关闭输入流。
void defaultReadObject()
从此流中读取当前类的非静态和非瞬态字段。
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()
已过时。
此方法无法将字节正确转换为字符。
long readLong()
读长64位。
Object readObject()
从ObjectInputStream中读取一个对象。

 

ObjectOutputStream

public class ObjectOutputStream
extends OutputStream
implements ObjectOutput, ObjectStreamConstants

 

实现的接口

Closeable , DataOutput , Flushable , ObjectOutput , ObjectStreamConstants , AutoCloseable 

 

部分方法

变量和类型方法描述
void close()
关闭流。
void defaultWriteObject()
将当前类的非静态和非瞬态字段写入此流。
void flush()
刷新流。
protected Object replaceObject​(Object obj)
此方法将允许ObjectOutputStream的受信任子类在序列化期间将一个对象替换为另一个对象。
void reset()
重置将忽略已写入流的任何对象的状态。
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)
将String写为字节序列。
void writeChar​(int val)
写一个16位字符。
void writeChars​(String str)
将String写为一系列字符。
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位长。

 

示例

try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("stu.txt"))) {
    out.writeObject(new Student("aaa", 111));
} catch (Exception e) {
    System.out.println(e.getMessage());
}

try (ObjectInputStream in = new ObjectInputStream(new FileInputStream("stu.txt"))) {
     in.readObject();
} catch (Exception e) {
     e.printStackTrace();
}

class Student implements Serializable {
  private String name;
  private int age;
}

 

 

对象部分属性序列化

  使用transient修饰符,在序列化时忽略属性

  private transient String name;

 

 

  使用static修饰符

    private static String name;

  // 在序列化后,给static修饰的属性重新赋值,反序列化后获取的值是重新赋值之后的值

 

 

  默认方法writeObject和readObject

    private void writeObject(ObjectOutputStream objOut) throws IOException {
        System.out.println("writeObject-----------");
        objOut.writeObject(name);
    }

    private void readObject(ObjectInputStream objIn) throws IOException,ClassNotFoundException {
        System.out.println("readObject-----------");
        name= (String) objIn.readObject();
    }            

  // 指定会被序列化的属性
  // 必须使用 private void 修饰这两个方法
  // Java调用ObjectOutputStream类检查其是否有私有的、无返回值的writeObject方法,如果有, 其会委托该方法进行对象序列化。

 

 

Externalizable

public interface Externalizable
extends Serializable

使用Externalizable接口需要实现readExternal方法和 writeExternal方法来实现序列化和反序列化

    @Override
    public void writeExternal(ObjectOutput out) throws IOException {
        out.writeObject(name);
    }
    @Override
    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
        name= (String) in.readObject();
    }

 

 

Serializable和Externalizable区别

区 别 Serializable Externalizable
实现复杂度 实现简单,Java对其有内建支持 实现复杂,由开发人员自己完成
执行效率 所有对象由Java统一保存,性能较低 开发人员决定哪个对象保存,可能造成速度提升
保存信息 保存时占用空间大 部分存储,可能造成空间减少
使用频率 偏低

 

 posted on 2021-03-20 23:32  一计  阅读(44)  评论(0)    收藏  举报