8 Serializable序列化与反序列化

来源:互联网 发布:淘宝男装代理货源网 编辑:程序博客网 时间:2024/05/21 21:45

转载地址:http://blog.csdn.net/wangloveall/article/details/7992448/

                  http://developer.51cto.com/art/201202/317181.htm

    http://www.cnblogs.com/wxgblogs/p/5849951.html            

一  Serializable序列化与反序列化

1 Java序列化就是把对象转换成字节序列,而Java反序列化就是把字节序列还原成Java对象。
2采用Java序列化与反序列化技术,一是可以实现数据的持久化,在MVC模式中很是有用;二是可以对象数据的远程通信。

3 Serializable是java的一个接口,jdk api的描述如下:序列化接口没有方法或字段,仅用于标识可序列化的语义。如果一个对象要序列化,有三种方法:1 implements Serialazable 用ObejectOutputStream 2 implements Serializable 定义了readObject()

3 implements Externalnalizable 并且必须实现readExternal(ObjectInput in)

4两个类的功能代码完全一致,但是序列化 ID 不同,他们无法相互序列化和反序列化。也就是(下面的是Throwable类的序列化ID):

private static final long serialVersionUID = -3042686055658047285L;

序列化 ID 在 Eclipse 下提供了两种生成策略,一个是固定的 1L,一个是随机生成一个不重复的 long 类型数据(实际上是使用 JDK 工具生成),在这里有一个建议,如果没有特殊需求,就是用默认的 1L 就可以,这样可以确保代码一致时反序列化成功。


二 为什么要序列化

1 数据的持久化(保存):

Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比JVM的生命周期更长。但在现实应用中,就可能要求在JVM停止运行之后能够保存(持久化)指定的对象,并在将来重新读取被保存的对象。Java对象序列化就能够帮助我们实现该功能。必须注意地是,对象序列化保存的是对象的"状态",即它的成员变量。由此可知,对象序列化不会关注类中的静态变量。

2 网络中传递对象:

除了在持久化对象时会用到对象序列化之外,当使用RMI(远程方法调用),或在网络中传递对象时,都会用到对象序列化。



三 实例

public class Student implements Serializable {private String name;private char sex;private int year;private double gpa;public Student() {}public Student(String name, char sex, int year, double gpa) {this.name = name;this.sex = sex;this.year = year;this.gpa = gpa;}public void setName(String name) {this.name = name;}public void setSex(char sex) {this.sex = sex;}public void setYear(int year) {this.year = year;}public void setGpa(double gpa) {this.gpa = gpa;}public String getName() {return this.name;}public char getSex() {return this.sex;}public int getYear() {return this.year;}public double getGpa() {return this.gpa;}}

public class UseStudent {public static void main(String[] args) {Student st = new Student("Tom", 'M', 20, 3.6);File file = new File("F:\\serial.txt");try {file.createNewFile();} catch (IOException e) {e.printStackTrace();}try {// Student对象序列化过程FileOutputStream fos = new FileOutputStream(file);ObjectOutputStream oos = new ObjectOutputStream(fos);oos.writeObject(st);oos.flush();oos.close();fos.close();// Student对象反序列化过程FileInputStream fis = new FileInputStream(file);ObjectInputStream ois = new ObjectInputStream(fis);Student st1 = (Student) ois.readObject();System.out.println("name = " + st1.getName());System.out.println("sex = " + st1.getSex());System.out.println("year = " + st1.getYear());System.out.println("gpa = " + st1.getGpa());ois.close();fis.close();} catch (ClassNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}
输出结果:
name = Tom
sex = M
year = 20

gpa = 3.6


说明:

1 程序的CLASSPATH中包含有Student.class(如果在别处引用也要有Student.class)

2 原理:看ObjectOutputStream的源码

3 当某个字段被声明为transient后,默认序列化机制就会忽略该字段

4 serial.txt的内容(不要用记事本打开,我是用sublime打开):

aced 0005 7372 0015 636f 6d2e 7465 7374
2e6d 6169 6e2e 5374 7564 656e 746b 6d8e
bb6f a4ca c602 0004 4400 0367 7061 4300
0373 6578 4900 0479 6561 724c 0004 6e61
6d65 7400 124c 6a61 7661 2f6c 616e 672f
5374 7269 6e67 3b78 7040 0ccc cccc cccc
cd00 4d00 0000 1474 0003 546f 6d

0 0
原创粉丝点击