Java 序列化与反序列化 学习手札

1 前言

最近在做某比赛的内容,所以原来很多没有涉及到的方面,到了这里都需要去学习,今天的内容就是序列化和反序列化了。这个学习手札主要内容是收集聚合我所看到的相关知识,加上一些自己的分析和理解,以及最后的Demo,供自己未来复习使用,也供大家参考。

2 基本知识介绍

首先需要理解下什么是序列化和反序列化,Java序列化是指把Java对象转换为字节序列的过程;而Java反序列化是指把字节序列恢复为Java对象的过程。这个说白了就是把Java程序中的对象转化成字节序列,使得我们可以保存、传输,而反序列化就是把上面那个字符序列重新还原成一个对象。

因此,当我们有一个对象,想直接存起来(或者交换到其他地方),那么我们只需要将其序列化,之后再反序列化,思想很简单,对吧?

3 JAVA API

首先,直接贴一个Java 序列化的相关知识,这章的主要内容来自这里:链接,我大部分都是粘贴的,注意了。

JDK类库中序列化API

java.io.ObjectOutputStream:表示对象输出流

它的writeObject(Object obj)方法可以对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。

java.io.ObjectInputStream:表示对象输入流

它的readObject()方法源输入流中读取字节序列,再把它们反序列化成为一个对象,并将其返回。

对于需要序列化的对象,其所对应的类需要实现Serializable或Externalizable接口,不然的话不能进行序列化。(这里只是一个基本的介绍,其实类可以让某些属性无法序列化,这个有机会再讨论)

当然,对于一般的序列化来说,其方法有:

假定一个Student类,它的对象需要序列化,可以有如下三种方法:

方法一:若Student类仅仅实现了Serializable接口,则可以按照以下方式进行序列化和反序列化

ObjectOutputStream采用默认的序列化方式,对Student对象的非transient的实例变量进行序列化。

ObjcetInputStream采用默认的反序列化方式,对对Student对象的非transient的实例变量进行反序列化。

方法二:若Student类仅仅实现了Serializable接口,并且还定义了readObject(ObjectInputStream
in)和writeObject(ObjectOutputSteam out),则采用以下方式进行序列化与反序列化。

ObjectOutputStream调用Student对象的writeObject(ObjectOutputStream
out)的方法进行序列化。

ObjectInputStream会调用Student对象的readObject(ObjectInputStream
in)的方法进行反序列化。

方法三:若Student类实现了Externalnalizable接口,且Student类必须实现readExternal(ObjectInput
in)和writeExternal(ObjectOutput out)方法,则按照以下方式进行序列化与反序列化。

ObjectOutputStream调用Student对象的writeExternal(ObjectOutput
out))的方法进行序列化。

ObjectInputStream会调用Student对象的readExternal(ObjectInput in)的方法进行反序列化。

4 代码示例

package mebiuw.Storage;

import java.io.*;
import java.util.HashMap;

/**
 * Created by 72770 on 2016/7/15.
 */
public class SerialWorker {
    /**
     * 将对象序列化,并写入对应的位置
     * @param object
     * @param position
     */
    public void writeObject(Object object, String position) {
        FileOutputStream fout = null;
        ObjectOutputStream out = null;
        try {
            fout = new FileOutputStream(position);
            out = new ObjectOutputStream(fout);
            out.writeObject(object);
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                fout.close();
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }

    }

    /**
     * 直接读出相应的对象
     * @param position
     * @return
     */
    public Object readObject(String position) {
        FileInputStream fin = null;
        ObjectInputStream in = null;
        Object obj = null;
        try {
            fin = new FileInputStream(position);
            in = new ObjectInputStream(fin);
            obj = in.readObject();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                in.close();
                fin.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
        return obj;

    }

    public static void main(String args[]){
        /**
         * 创建一个map,写入文件,然后再恢复到result中
         * 
         * 最后尝试相应的字段,看成功了么?
         */
        SerialWorker worker = new SerialWorker();
        HashMap<String,String> mapper = new HashMap<String, String>();
        mapper.put("name","mebiuw");
        worker.writeObject(mapper,"test.obj");
        HashMap<String,String> result =(HashMap<String,String> ) worker.readObject("test.obj");
        System.out.println(result.get("name"));
    }
}

待续ing….

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值