序列化与发序列化

来源:互联网 发布:煲耳机方法知乎 编辑:程序博客网 时间:2024/06/04 14:48

      最近在做一个关于考试大数据日志分析的项目,在解决抽取试卷存放的问题中遇到需要对数据进行序列化和反序列化的问题,借此进一步了解序列化与反序列化的颜色。

      序列化,简单的理解是说将对象转换成容易传输的格式的过程,把java对象转换成字节序列的过程,重要的作用是在传输和保存,保证数据的可传递性和完整性;反序列化,便是将字节对象恢复java对象的过程,重新构造成传输前的对象。

      那么如何实现序列化与反序列化?

      实现序列化首先需要序列化的类要实现了Serializable或Externalizable接口。需要被序列化的类实现Serializable接口,接口没有实现,implements Serializable是用来标注对象可以被序列化。然后使用一个输出流来构造一个ObjectOutputStream对象,接着使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。  

      具体地说:序列化首先创建一个对象输出流,可以包装一个其它类型的目标输出流,例如文件输出流:

ObjectOutputStream out = new ObjectOutputStream(new fileOutputStream(“E:\\objectfile.obj”));
      其次,使用对象输出流的writeObject()方法写对象:

out.writeObject(“nihao”);out.writeObject(new Date());
      反序列则是将容易传输的格式回复成对象,步骤与序列化是类似的。首先,创建一个对象输入流,它可以包装一个其它类型输入流,如文件输入流:

ObjectInputStream in = new ObjectInputStream(new fileInputStream(“D:\\objectfile.obj”));
      其次,通过对象输出流的readObject()方法读取对象:

String objString = (String)in.readObject();Date objDate = (Date)in.readObject();
      用一张图形象描述这个过程如下:



      进一步理解它们的含义和使用,下面用haspmap类型对象进行序列化与反序列化做说明:
public class test {//Jedis jedis =  new Jedis("192.168.88.15",6379);public static void main(String args[]) {        writer();        reader();    }    public static void writer(){        Map<Integer,ExamPaper> exampapers=new HashMap<Integer,ExamPaper>();        exampapers.put(1, new ExamPaper("daxueyingyu"));        exampapers.put(2, new ExamPaper("zhongguojindaishi"));        File paperInfo = new File("paperInfo.txt");        ObjectOutputStream oos = null;        try {            oos = new ObjectOutputStream( new FileOutputStream(paperInfo));            oos.writeObject(exampapers);        } catch (FileNotFoundException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }finally{            try {                oos.flush();                oos.close();            } catch (IOException e) {                e.printStackTrace();            }        }    }    public static void reader(){        Map<Integer,ExamPaper> exampapers= null;        File paperInfo = new File("paperInfo.txt");        ObjectInputStream ois = null;        try {            ois = new ObjectInputStream(new FileInputStream(paperInfo));            Object o = ois.readObject();            exampapers = (Map<Integer,ExamPaper>)o;                         System.out.println(exampapers);        } catch (FileNotFoundException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        } catch (ClassNotFoundException e) {            e.printStackTrace();        }finally{            try {                ois.close();            } catch (IOException e) {                e.printStackTrace();            }        }    }     }class ExamPaper implements Serializable{    ExamPaper(String name){        this.name = name;    }    private String name;         @Override    public String toString(){                 return "ExamPaper name:"+name;    }}
      至此,对它们是不是有初步的了解,深入的颜色需要我们进一步的探究。


0 0