序列化与反序列化的简单粗暴解释

1、内容简介java


1.什么是序列化和反序列化?网络


(1)序列化就是把Java对象转化为字节流序列(二进制串)的过程ide

(2)反序列化就是把字节流(二进制串)恢复为Java对象的过程测试


2.为何要进行序列化spa


    咱们知道,当两个进程须要通讯的时候,能够发送各类类型的数据,包括文字、图片、音频和视频,可是这些数据都是以二进制的形式在网络上传输。因此当两个Java进程进行通讯的时候,如何实现进程间对象的传送呢。这就须要用到序列化和反序列化了。一方面,发送方将这个Java对象转化为字节对象,而后在网络上传输。另外一个方面,接收方须要从字节序列中恢复出Java对象。.net


3.好处orm


第一.利用序列化实现远程的通讯,即在网络上传输信息。第二,能够实现数据的持久化,经过序列化能够把数据永久的保存到硬盘上。视频


2、Java类库中的序列化对象


   Java.io.ObjectOutputStream表明对象输出流,它的WriteObject( object obj) 方法能够对指定的obj对象进行序列化,把获得的二进制串输入到指定的文件中。blog

  与此相对应,Java.io.ObjectInputStream表明对象输入流,它的readObject(object obj)方法能够将读取的二进制串进行反序列化为Java对象,而且将其返回。

只有实现了Serializable接口的类才可以被序列化,因此必定要实现Serializable。跳进去你会发现,只有一个Serializable接口。

[java]  view plain  copy
 
 
  1. <span style="font-family:KaiTi_GB2312;font-size:18px;"> * @author  unascribed  
  2.  * @version 1.2511/17/05  
  3.  * @see java.io.ObjectOutputStream  
  4.  * @see java.io.ObjectInputStream  
  5.  * @see java.io.ObjectOutput  
  6.  * @see java.io.ObjectInput  
  7.  * @see java.io.Externalizable  
  8.  * @since   JDK1.1  
  9.  */  
  10. public interface Serializable {  
  11. }</span>  

2.对象序列化的步骤以下


(1)建立对象输入流,它能够包装一个其余类型的目标输入流,例如:文件输出流。

(2)经过对象输入流的writeObject()方法写对象。


3.对象的反序列化以下:


(1)建立对象输入流,一样的,能够包含其余类型的目标输出流,例如:文件输入流。

(2)经过对象输入流的readObject()方法读取对象。


4.实例


(1)建立User对象

[java]  view plain  copy
 
 
  1. <span style="font-family:KaiTi_GB2312;font-size:18px;">/** 
  2.  * 用户 
  3.  * @author lizhenjuan 
  4.  */  
  5. public class User implements java.io.Serializable{  
  6.   
  7.     private static final long serialVersionUID = 1L;  
  8.     private Long id;  
  9.   
  10.     private String name; // 真实姓名  
  11.     private String loginName; // 登陆名  
  12.     private String description; // 说明  
  13. }  
  14. </span>  


(2)序列化Use对象

[java]  view plain  copy
 
 
  1. <span style="font-family:KaiTi_GB2312;font-size:18px;"/** 
  2.      * User对象序列化测试代码 
  3.      * @throws FileNotFoundException 
  4.      * @throws IOException 
  5.      */  
  6.     @Test  
  7.     private  static void SerializablePerson() throws Exception, FileNotFoundException, IOException{  
  8.           
  9.         User user = new User();  
  10.         user.setName("lizhenjuan");  
  11.         user.setLoginName("lzh");  
  12.         user.setDescription("just test");  
  13.           
  14.         //输出流,将对象输出到txt文件中  
  15.         ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream(new File("F:/User.txt")));  
  16.         oo.writeObject(user);  
  17.         System.out.println("序列化成功!");  
  18.         oo.close();  
  19.           
  20.     }</span>  

执行结果,是在F 盘下生成了User.txt文件。


(3)反序列化User对象

 

[java]  view plain  copy
 
 
  1. <span style="font-family:KaiTi_GB2312;font-size:18px;">/** 
  2.      * 反序列化User对象,对去User.txt文件内容 
  3.      * @return 
  4.      * @throws Exception 
  5.      * @throws FileNotFoundException 
  6.      * @throws IOException 
  7.      * @throws ClassNotFoundException 
  8.      */  
  9.     private  static User  DeserializePerson() throws  Exception,FileNotFoundException, IOException, ClassNotFoundException {  
  10.           
  11.         ObjectInputStream ois=new ObjectInputStream(new FileInputStream(new File("F:/User.txt")));  
  12.         User user =(User)ois.readObject();  
  13.         System.out.println("User对象反序列化成功");  
  14.         return user;              
  15.     }  
  16.            //读取User.txt文件的内容  
  17.   
  18.           public  static void main(String[] args) throws Exception{  
  19.           
  20.         User user = DeserializePerson(); //反序列化对象  
  21.         System.out.println(MessageFormat.format("name={0},loginName={1},description={2}",  
  22.                 user.getName(),user.getLoginName(),user.getDescription()));   
  23.     }  
  24.   
  25.   
  26. </span>  


 

读取F盘User.txt文件内容,打印出来。
打印内容以下:

 

3、SerialVersionUID 的做用


1.两种类型


SerialVersionUID:意思是序列化的版本号,凡是实现序列化接口的类都会有一个表示序列化版本标识的静态变量。
SerialVersionUID的两种生成方式。
第一种
 采用这种方式生成的SerialVersionUID是1L;
private static final long serialVersionUID = 1L;
第二种
这一种是根据类名称、接口名称、方法和属性来生成的。
private static final long serialVersionUID = 4603642343377807741L;


2.SerialVersionID做用是什么?

     SerialVerssionID 保证在不少类中,某个类的编号是惟一的。若是在实体类中,没有显式声明SerialVersionID,那么java编译器会自动给你生成一个ID。若是要在序列化以后的实体中添加一个字段,那么序列化以后,就又会生成一个SerialVersionID ,因而就会出现两个序列化版本号不一致的错误。因此,咱们在类中显式声明乐SerialVersionUID以后,就能够在序列化以后,增长或者删除一个字段,而不会影响到后期的还原。还原以后,可使用。    类的serialVersionUID的默认值彻底依赖于Java编译器的实现,对于同一个类,用不一样的Java编译器编译,有可能会致使不一样的 serialVersionUID,也有可能相同。为了提升serialVersionUID的独立性和肯定性,强烈建议在一个可序列化类中显示的定义serialVersionUID,为它赋予明确的值。

相关文章
相关标签/搜索