Java 序列化


序列化机制

  • 一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和储存在对象中数据的类型
  • 按序列化对象写入文件之后,可以从文件中读取出来,并且对它进行反序列化,即对象的类型信息、对象的数据、还有对象中的数据类型可以用来在内存中新建对象
  • 在一个平台上序列化的对象可以在另一个完全不同的平台上反序列化该对象
  • 类ObjectOutputStream包含序列化一个对象的方法public final void writeObject(Object x) throws IOException,并将它发送到输出流
  • 类ObjectInputStream包含反序列化一个对象的方法public final Object readObject() throws IOException,ClassNotFoundException,返回值为Object,你需要将它转换成合适的数据类型
  • 一个类的对象要想序列化成功,必须实现java.io.Serialzable接口,并且该类的所有属性是可序列化的。如果有一个属性不是可序列化的,则改属性必须注明是短暂的(transient)
public class ClassName implements java.io.Serializable {
    public String name;
    public int age;
    // public transient int SSN;
    ...
}

序列化对象

  • 当序列化一个对象到文件时,按Java的标准约定给文件一个.ser扩展名
import java.io.*;

public class SerializeDemo {
    public static void main(Strign[] args) {
        ClassName cn = new ClassName(); // ClassName为可序列化的某个类
        cn.name = "java"; // 假设类有两个变量name、age
        cn.age = 23;
        try{
            FileOutputStream fo = new FileOutputStream("/.../classname.ser");
            ObjectOutputStream out = new ObjectOutputStream(fo);
            out.writeObject(cn);
            out.close();
            fo.close();
            System.out.printf("Serialized data is saved in /.../classname.ser");
        }catch(IOCxception e){
            e.printStackTrace();
        }
    }
}

反序列化对象

  • /…/classname.ser存储了ClassName对象
import java.io.*;

public class DeserializeDemo {
    public static void main(Strign[] args) {
        ClassName cn = null;
        try{
            FileInputStream fi = new FileInputStream("/.../classname.ser");
            ObjectInputStream in = new ObjectInputStream(fi);
            cn = (ClassName) in.readObject();
            in.close();
            fi.close();
        }catch(IOCxception e){
            e.printStackTrace();
            return;
        }catch(ClassNotFoundException c){
            System.out.println("ClassName class not found");
            e.printStackTrace();
            return;
        }   
        System.out.println("Deserialized ClassName...");    
        System.out.println("Name:" + cn.name);  
        System.out.println("age:" + cn.age);    
    }
}
  • readObject()要尝试捕获ClassNotFoundException异常
  • readObject()的返回值应转化为类引用
  • 对于JVM可以反序列化对象,它必须是能够找到字节码的类
  • 对于短暂的某个(最多一个)属性,该值没有被发送到输出流,反序列化后变成默认值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值