Externalizable

#序列化的控制Externalizable


通过实现Externalizable 接口,用它代替Serializable 接口,便可控制序列化的具体过程

这个Externalizable 接口扩展了 Serializable,并增添了两个方法:writeExternal()和readExternal()在序列化和重新装配的过 程中,会自动调用这两个方法,以便我们执行一些特殊操作

千万不可仅在 writeExternal()方法执行期间写入对象的重要数据(没有默认的行为可用来为一个 Externalizable 对象写入所有成员对象)的,而是必须在 readExternal()方法中也恢复那些数据

package com.zy.chapter10;

import java.io.*;

class Cat1 implements Externalizable {
    private String catName;

    public Cat1(String catName) {
        this.catName = catName;
        System.out.println("Cat1 Constructor");
    }

    public Cat1(){
        System.out.println("Cat1 constructor2");
    }
    
    //recover date in readExternal
    @Override
    public void readExternal(ObjectInput arg0) throws IOException, ClassNotFoundException {
        System.out.println("cat1 readExternal");
        this.catName=(String) arg0.readObject();
    }

    //save date in writeExternal
    @Override
    public void writeExternal(ObjectOutput arg0) throws IOException {
        System.out.println("cat1 writeExternal");
        arg0.writeObject(catName);
    }
    
    public String getName(){
        return catName;
    }
}

class Cat2 implements Externalizable{
    private String catName;

    public Cat2(String catName) {
        this.catName = catName;
        System.out.println("Cat2 Constructor");
    }

    public Cat2(){
        System.out.println("Cat2 constructor2");
    }
    
    //recover date in readExternal
    public void readExternal(ObjectInput arg0) throws IOException, ClassNotFoundException {
        System.out.println("cat2 readExternal");
    }

    //save date in writeExternal
    public void writeExternal(ObjectOutput arg0) throws IOException {
        System.out.println("cat2 writeExternal");
    }
    
    public String getName(){
        return catName;
    }
}

/**
 *
 * @ClassName  ExternalizableDemo.java
 * @function   function of Externalizable Class
 * @author 	   yiz 
 * @version	   V1.0 
 * @date       2018年1月11日
 */
public class ExternalizableDemo {

    public static void main(String[] args) {
        Cat1 cat=new Cat1("kitty");
        try {
            //write object
            ObjectOutputStream objouts=new ObjectOutputStream(new FileOutputStream("cat1.txt"));
            objouts.writeObject(cat);
            objouts.close();
            
            //read object
            ObjectInputStream objins=new ObjectInputStream(new FileInputStream("cat1.txt"));
            //use constructor2 
            Cat1 cat1=(Cat1) objins.readObject();
            objins.close();
            
            System.out.println("cat1 "+cat1.getName());
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        System.out.println();
        //not save and recover the date in writeExternalizable and readExternalizable
        Cat2 cat2=new Cat2("kitty2");
        try {
            //write object
            ObjectOutputStream objouts=new ObjectOutputStream(new FileOutputStream("cat2.txt"));
            objouts.writeObject(cat2);
            objouts.close();
            
            //read object
            ObjectInputStream objins=new ObjectInputStream(new FileInputStream("cat2.txt"));
            //use constructor2 
            Cat2 cat3=(Cat2) objins.readObject();
            objins.close();
            
            System.out.println("cat1 "+cat3.getName());
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

Cat1 Constructor
cat1 writeExternal
Cat1 constructor2
cat1 readExternal
cat1 kitty

Cat2 Constructor
cat2 writeExternal
Cat2 constructor2
cat2 readExternal
cat1 null


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值