网上很多关于java序列化与反序列化的说明与例子,看多了也会感觉烦扎,还不如以自己的语言记录下对java序列化与反序列化的原理。
首先了解什么是序列化:我们每天都上网,聊天,逛人人,微博,贴吧,论坛,也打下LOL,这之间信息每时每刻都在网络之间进行传输,那信息是以什么样的流的形式进行传输勒,我们都知道那是字节流,网络间信息的传输都是以字节流进行传输,字符流传输只不过是为字节流加了一层包装而已,似的传输多样化(比如一次性传输更多,带缓冲传输),现在问题来了,网络间信息的传输是以字节流进行传输,那么我们怎么样把我们需要传输的内容进行转换后后成为网络间必须的字节流,多说了点废话--那就是java序列化。
那当我们接收网络间的信息怎么才能进行读取,那就是反序列化。
1:什么是java序列化?
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。 序列化是为了解决在对对象流进行读写操作时所引发的问题。 2:怎么实现java序列化? 查看java API,可以看见API对序列化有这样的解释:类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。
序列化接口没有方法或字段,仅用于标识可序列化的语义。现在我们知道要实现对象序列化,那就必须实现Serializable接口!
3:什么是反序列化
反序列化就是把网络传输的二进制流进行读取,取出传输对象,就好比你的qq好友给你发送信息,你利用java反序列化进行信息的读取换换成我们所知道的汉字,就好比通信中的A/D,D/A转换一样 4:基于java序列化程序与反序列化的实现 首先查看API,java.io.ObjectOutputStream代表对象输出流。ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream。可以使用 ObjectInputStream 读取(重构)对象。通过在流中使用文件可以实现对象的
持久存储。如果流是网络套接字流。则可以在另一台主机上或另一个进程中重构对象。 只能将支持 java.io.Serializable 接口的对象写入流中。每个 serializable 对象的类都被编码,
编码内容包括类名和类签名、对象的字段值和数组值,以及从初始对象中引用的其他所有对象的闭包。 writeObject 方法用于将对象写入流中。所有对象(包括 String 和数组)都可以通过 writeObject 写入。
可将多个对象或基元写入流中。必须使用与写入对象时相同的类型和顺序从相应 ObjectInputstream 中读回对象。
对象序列化包括如下步骤:
1) 创建一个对象输出流,它可以包装一个其他类型的目标输出流,如文件输出流; 2) 通过对象输出流的writeObject()方法写对象。
对象反序列化的步骤如下: 1) 创建一个对象输入流,它可以包装一个其他类型的源输入流,如文件输入流; 2) 通过对象输入流的readObject()方法读取对象。
代码如下:
package com.test; import java.io.*; public class Person implements Serializable { private String name = ""; public Person(){ name = "高中同学都叫我ROBIN"; } public Person(String name){ this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } public static void main(String[] args) { Person person =new Person(); //File file = new File("H:\\test.txt");//建议用File.separator try { FileOutputStream fos = new FileOutputStream("test.out");//暂存内容 ObjectOutputStream oos = new ObjectOutputStream(fos); System.out.println(" 1> " + person.getName()); person.setName("我为自己代言!!!"); oos.writeObject(person);//将对象写入流 oos.close(); } catch (Exception ex) { ex.printStackTrace(); } try { FileInputStream fis = new FileInputStream("test.out"); ObjectInputStream ois = new ObjectInputStream(fis); person = (Person) ois.readObject(); System.out.println(" 2> " + person.getName()); ois.close(); } catch (Exception ex) { ex.printStackTrace(); } } } 测试结果如下: 如果没有实现序列化接口,测试结果会提示你报类没有序列化。 最后: 其实关于序列化的知识点还有很多,比如声明为static 的变量是不能够被序列化的,具体测试看我的下一篇博文吧!