首页 > 代码库 > I/O、序列化

I/O、序列化

1)流序列化对象ObjectOutputStream调用writerObject写出序列化对象,ObjectInputStream调用readObject读取序列化对象,序列化的对象必须要实现Serializable接口,该接口没有任何需要待实现的方法,只需继承即可。序列化之前的对象和序列化之后的对象是两个不同的对象,两者不是相等的。

序列化代码样例:

        //写出序列化
        String path="G:\\obj.txt";
        ObjectOutputStream stream=new ObjectOutputStream(new FileOutputStream(path));
        stream.writeObject(student);
        stream.close();

        // 读取序列化
        ObjectInputStream inputStream=new ObjectInputStream(new FileInputStream(path));
        Student student2=(Student)inputStream.readObject();
        inputStream.close();

在序列化过程中,某些域(属性)不想被序列化,可以使用transient标记不被序列化(方法不适用transient),不可序列化的类作为一个属性表示的话一定要加上transient不然会报NotSerializableException。

例子:

    private transient String _date;

技术分享

方法标记transient报错 必须去掉transient标记。

2)使用Externalizable接口可以定制自己的序列化机制,此接口有两个公开的可重写的方法readExternal和writeExternal

代码样例:

 public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
        // TODO 自动生成的方法存根

        ExternalDemo demo = new ExternalDemo();
        demo.setName("zhangsan");
        
        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(
                Paths.get("G:\\", "ExternalDemo.dat").toFile()));
        demo.writeExternal(out);

        ObjectInputStream in = new ObjectInputStream(new FileInputStream(Paths
                .get("G:\\", "ExternalDemo.dat").toFile()));
        demo.readExternal(in);
        System.out.println(demo.getName());
        
  }
public class ExternalDemo implements Externalizable {

    private String _name;

    public String getName() {
        return _name;
    }

    public void setName(String name) {
        _name = name;
    }

    @Override
    public void readExternal(ObjectInput in) throws IOException,
            ClassNotFoundException {
        // TODO 自动生成的方法存根
        _name = (String) in.readObject();
    }

    @Override
    public void writeExternal(ObjectOutput out) throws IOException {
        // TODO 自动生成的方法存根
        out.writeObject(_name);
    }

}

 

I/O、序列化