Java序列化基础

原文地址:http://www.yanwushu.com/post/24.html


本文将简介java序列化和反序列化的概念,并且提供一个简单类的序列化和反序列化实现。

概念

序列化:将实例的结构和数据保存到文件、网络等目的地的过程叫做序列化。

持久化和序列化的区别:持久化和序列化都是指将瞬时的实例结构及其数据存储到一个目的地,但是持久化的目的地是文件或者数据库等持久的,相对持久化来说,序列化的目的地不一定是持久的。

使用场景

1.  网络数据传输,使用ajax请求服务器数据,服务器端一般会将数据实例序列化为xml或者json返回给浏览器,使用js接收到序列化后的数据字符串,然后转为js对象使用。

2.  网络编程中将实例序列化通过sockt传递给接受者,然后接受者反序列化后得到对象,然后使用。

实现简单的序列化和反序列化

本例将java实例序列化到文件,然后读取文件反序列化得到对象实例。在本例中需要注意以下几点:

1.  被序列化的类必须实现 java.io.Serializable 接口,此接口是一个标记接口,并没有待实现的方法。

2.  静态成员不会被序列化。

3.  被transient关键字修饰的成员不会被序列化。

4.  将多个实例序列化到一个目标(在此例中目的地为文件)时,反序列化读对象的顺序应该和序列化写的顺序是相同的。比如有三个实例a、b、c,他们序列化的顺序为a、b、c,那么反序列化时,最先读到的对象实例是a、最后读到的实例为c。

5.  目标文件是一个二进制文件,而不是文本文件。

案例

import java.io.Serializable;

/**
 * Created by yanwushu on 2016/7/18. */
public class Cat implements Serializable{

    private static String TEMP = "this is a test string";//静态成员不会被序列化

    private String name;
    private transient int age;//transient修饰符修饰的成员不会被序列化

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Cat{" +
                "temp ="+TEMP+
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

package org.yanwushu.serialize.example;

import org.junit.Test;

import java.io.*;

/**
 * Created by yanwushu on 2016/7/18.
 */
public class TestClass {

    //简单的类序列化
    @Test
    public void serializeTest(){
        Cat c = new Cat("kitty" , 2);
        try {
            FileOutputStream fos = new FileOutputStream("cat.yanwushu");
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(c);
            oos.flush();
            oos.close();
            System.out.println("cat serialized completed:" + c.toString());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //简单的类反序列化
    @Test
    public void deserializeTest(){
        try {
            FileInputStream fis = new FileInputStream("cat.yanwushu");
            ObjectInputStream ois = new ObjectInputStream(fis);
            Cat c = (Cat) ois.readObject();
            ois.close();
            System.out.println("cat deserialize completed , and the content is :"+c.toString());
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值