10030---java序列化和serialVersionUID
2016-03-03 17:58
381 查看
原文
1、序列化:
序列化可以将一个java对象以二进制流的方式在网络中传输并且可以被持久化到数据库、文件系统中,
反序列化则是可以把之前持久化在数据库或文件系统中的二进制数据以流的方式读取出来重新构造成一个和之前相同内容的java对象。
2、序列化的作用:
第一种:用于将java对象状态储存起来,通常放到一个文件中,使下次需要用到的时候再读取到它之前的状态信息。
第二种:可以让java对象在网络中传输。
3、序列化的实现:
1)、需要序列化的类需要实现Serializable接口,该接口没有任何方法,只是标示该类对象可被序列化。
2)、序列化过程:使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就
可以将参数为obj的对象写出(即保存其状态)
3)、反序列化过程:使用一个输入流(如:FileInputStream)来构造一个ObjectInputStream(对象流)对象,接着,使用ObjectInputStream对象的readObject(Object obj)方法就可以将
参数为obj的对象读出(即获取其状态)
4、静态long类型常量serialVersionUID的作用:
如果没有设置这个值,你在序列化一个对象之后,改动了该类的字段或者方法名之类的,那如果你再反序列化想取出之前的那个对象时就可能会抛出异常,
因为你改动了类中间的信息,serialVersionUID是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,当修改后的类去反序列化的时候发现该类的
serialVersionUID值和之前保存在问价中的serialVersionUID值不一致,所以就会抛出异常。
而显示的设置serialVersionUID值就可以保证版本的兼容性,如果你在类中写上了这个值,就算类变动了,它反序列化的时候也能和文件中的原值匹配上。
而新增的值则会设置成null,删除的值则不会显示。
5、例子:
如果一个类可被序列化,其子类也可以,如果该类有父类,则根据父类是否实现Serializable接口,实现了则父类对象字段可以序列化,
没实现,则父类对象字段不能被序列化。
声明为transient类型的成员数据不能被序列化。transient代表对象的临时数据;
当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化;
1、序列化:
序列化可以将一个java对象以二进制流的方式在网络中传输并且可以被持久化到数据库、文件系统中,
反序列化则是可以把之前持久化在数据库或文件系统中的二进制数据以流的方式读取出来重新构造成一个和之前相同内容的java对象。
2、序列化的作用:
第一种:用于将java对象状态储存起来,通常放到一个文件中,使下次需要用到的时候再读取到它之前的状态信息。
第二种:可以让java对象在网络中传输。
3、序列化的实现:
1)、需要序列化的类需要实现Serializable接口,该接口没有任何方法,只是标示该类对象可被序列化。
2)、序列化过程:使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就
可以将参数为obj的对象写出(即保存其状态)
3)、反序列化过程:使用一个输入流(如:FileInputStream)来构造一个ObjectInputStream(对象流)对象,接着,使用ObjectInputStream对象的readObject(Object obj)方法就可以将
参数为obj的对象读出(即获取其状态)
4、静态long类型常量serialVersionUID的作用:
如果没有设置这个值,你在序列化一个对象之后,改动了该类的字段或者方法名之类的,那如果你再反序列化想取出之前的那个对象时就可能会抛出异常,
因为你改动了类中间的信息,serialVersionUID是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段,当修改后的类去反序列化的时候发现该类的
serialVersionUID值和之前保存在问价中的serialVersionUID值不一致,所以就会抛出异常。
而显示的设置serialVersionUID值就可以保证版本的兼容性,如果你在类中写上了这个值,就算类变动了,它反序列化的时候也能和文件中的原值匹配上。
而新增的值则会设置成null,删除的值则不会显示。
5、例子:
package com.sxit; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; public class Serializable01 extends Object implements Serializable{ private static final long serialVersionUID = -1466479389299512377L; public byte b = 12; public byte getB() { return b; } public void setB(byte b) { this.b = b; } public static void main(String[] args) { try { FileOutputStream fos = new FileOutputStream(new File("E:\\tmp\\demo2.txt")); ObjectOutputStream os = new ObjectOutputStream(fos); Serializable01 s = new Serializable01(); os.writeObject(s); os.flush(); os.close(); FileInputStream fis = new FileInputStream(new File("E:\\tmp\\demo2.txt")); ObjectInputStream ois = new ObjectInputStream(fis); Serializable01 s2 = (Serializable01)ois.readObject(); System.out.println(s2.getB()); ois.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } }6、序列化特点:
如果一个类可被序列化,其子类也可以,如果该类有父类,则根据父类是否实现Serializable接口,实现了则父类对象字段可以序列化,
没实现,则父类对象字段不能被序列化。
声明为transient类型的成员数据不能被序列化。transient代表对象的临时数据;
当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化;
相关文章推荐
- POJ 2031 Building a Space Station
- 使用requestAnimationFrame做动画效果二
- 线程操作 NSOperation以及他的子类与 NSOperationQueue的搭配使用
- UEFI 模式ghost win10
- maven项目出现如下错误,求指点;CoreException: Could not calculate build plan:
- 通过实现一个TableView来理解iOS UI编程
- 生成缩略图的UIImage分类
- 除了UUID以外随机生成图片名的方法
- UI-GCD线程
- UI-NSOperation线程
- Android Studio BUILD FAILED finished with non-zero exit value
- JAVA:string中的copyValueOf方法
- Ubuntu LiveSuit V3.06不能烧写问题
- 系统API:UIView阻尼动画
- UIImage 图片处理:截图,缩放,设定大小,存储
- 设置cookie值(key,value,过期天数,域名)functionsetCookie(cookieName, cookieValue, expire
- 【UI】【View】自定义布局方法与注意事项(二)
- iOS学习之路-UIPickerView初认识与使用
- UITableView点击切换状态分析
- 获取当前UITableViewCell在TableView上的索引