序列化与反序列化

概念

序列化与反序列化

  • Java序列化就是将Java对象转换成字节序列的过程
  • Java反序列化就是将字节序列恢复为Java对象的过程

用途

  • 数据的持久化,通过将数据对象序列化可以让数据对象脱离内存,可以写入物理磁盘或者数据库从而将数据持久的保存
  • 远程数据传输,比如文件、图片、音频、视频等都是通过二进制序列的方式进行交换数据的。通过序列化,将Java对象转换为字节序列,就可以实现数据的远程通信。

JDK序列化与反序列化

只有实现了Serializable或者Externalizable接口的类的对象才能被序列化。Externalizable继承自Serializable接口,区别在于实现Externalizable可控制序列化的行为,而实现Serializable接口的类则采用默认的序列化方式

对象序列化步骤

  1. 创建一个对象输出流,包装一个其他类型的输出流
  2. 调用对象输出流的writeObject()方法写对象

对象反序列化步骤

  1. 创建一个对象输入流,包装一个其他类型的输入流
  2. 调用对象输入流的readObject()方法获取对象

提供两个序列化与反序列化示例

此处示例均略去Person类代码

示例一(将对象放入文件)

public class TestObjSerializeAndDeserialize {

    public static void main(String[] args) throws Exception {
        SerializePerson();//序列化Person对象
        Person p = DeserializePerson();//反序列Perons对象
        System.out.println(MessageFormat.format("name={0},age={1},sex={2}",
                                                 p.getName(), p.getAge(), p.getSex()));
    }

    /**
     * MethodName: SerializePerson 
     * Description: 序列化Person对象
     * @author xudp
     * @throws FileNotFoundException
     * @throws IOException
     */
    private static void SerializePerson() throws FileNotFoundException,
            IOException {
        Person person = new Person();
        person.setName("gacl");
        person.setAge(25);
        person.setSex("男");
        // ObjectOutputStream 对象输出流,将Person对象存储到E盘的Person.txt文件中,完成对Person对象的序列化操作
        ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream(
                new File("E:/Person.txt")));
        oo.writeObject(person);
        System.out.println("Person对象序列化成功!");
        oo.close();
    }

    /**
     * MethodName: DeserializePerson 
     * Description: 反序列Perons对象
     * @author xudp
     * @return
     * @throws Exception
     * @throws IOException
     */
    private static Person DeserializePerson() throws Exception, IOException {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(
                new File("E:/Person.txt")));
        Person person = (Person) ois.readObject();
        System.out.println("Person对象反序列化成功!");
        return person;
    }

}

示例二(将对象放入Redis缓存)

/**
     * 序列化
     */
public static byte[] serialize(Object obj){
        ObjectOutputStream oos = null;
        ByteArrayOutputStream bos = null;
        bos = new ByteArrayOutputStream();
        try {

            oos = new ObjectOutputStream(bos);//包装byte数组到输出流
            oos.writeObject(obj);
            byte[] bytes = bos.toByteArray();
            oos.flush();
            oos.close();
            bos.close();
            return bytes;
        } catch (IOException e) {
            e.printStackTrace();

        }
        return null;
    }

    /**
     * 反序列化
     */
    public static Object unserialize(byte[] bytes){
        ObjectInputStream ois = null;
        ByteArrayInputStream bis = null;
        bis = new ByteArrayInputStream(bytes);
        try {
            ois = new ObjectInputStream(bis);//将字节数组包装进输入流
            ois.close();
            bis.close();
            return ois.readObject();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 放入对象
     */
    @Test
    public void setObject(){
        Person p = new Person(100,"lucy");
        Jedis jedis = new Jedis("localhost");
        jedis.set("person:100".getBytes(), SerializableUtil.serialize(p));
        p = new Person(101,"rose");
        jedis.set("person:101".getBytes(), SerializableUtil.serialize(p));
    }

    /**
     * 取出对象
     */
    public Person getObject(int id){
        Jedis jedis = new Jedis("localhost");
        byte[] person = jedis.get(("person:"+id).getBytes());
        return (Person)SerializableUtil.unserialize(person);
    }

    public static void main(String[] args){
        SerializableUtil su = new SerializableUtil();
        Person p = su.getObject(100);
        System.out.println(p.toString());
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值