序列化与反序列化解析和案例

**java

序列化与反序列化解析和案例

一 什么是序列化?web

1–java序列化是指把java对象转换为字节序列的过程,而java反序列化是指把字节序列恢复为java对象的过程算法

2–序列化:对象序列化的最主要的用处就是在传递和保存对象的时候,保证对象的完整性和可传递性。序列化是把 对象转换成有序字节流,以便在网络上传输或者保存在本地文件中。序列化后的字节流保存的java对象的状态以及相 关的描述信息。序列化机制的核心做用就是对象状态的保存与重建。数据库

3–反序列化:客户端从文件中或网络上得到序列化后的对象字节流后,根据字节流中所保存的对象状态及描述信 息,经过反序列化重建对象。网络

4–序列化就是把实体对象状态按照必定的格式写入到有序字节流,反序列化就是从有序字节流重建对象,恢复对象 状态svg

二 为何须要序列化与反序列化spa

当两个进程进行远程通讯时,能够相互发送各类类型的数据,包括文本,图片,音频,视频等,而这些数据都会以二 进制的形式在网络上传送。code

当两个java进行进行通讯时,要传送对象,怎么传对象,经过序列化与反序列化。 也就是说,发送方须要把对象转换为字节序列,而后在网络上传送,另外一方面,接收方须要从字节序列中恢复出java 对象视频

三 序列化的好处xml

1–永久性保存对象,保存对象的字节序列到本地文件或者数据库中,实现了数据的持久化,经过序列化能够把数据 永久的保存到硬盘上,

2–利用序列化实现远程通讯,能够在网络上传送对象的字节序列。

3–在进程间传递对象

四 序列化算法步骤

1–把对象实例相关的类元数据输出

2–递归输出类的超类描述直到再也不有超类

3–类元数据完了之后,开始从最懂曾的超类开始输出对象实例的实际数据值。 4–从上至下递归输出实例的数据

五 Java 如何实现序列化和反序列化

1-- JDK类库中序列化API java.io.ObjectOutputStream: 表示输出对象流
它的writeObject(Object obj)方法能够对参数指定的obj对象进行序列化,把获得的字节序列写到一个目标输出流 中;

2–java.io.ObjectInputStream:表示对象输入流
它的readObject()方法源输入流中读取字节序列,再把它们反序列化成为一个对象,并将其返回

3–实现序列化的要求 只有实现了Serializable或Externalizable接口的对象才能被序列化,不然抛出异常!

4–实现java对象序列化与反序列化的方法

例 a 类,它的对象须要序列化,有3种方法 若是类a仅仅实现了Serializable接口,则ObjectOutputStream采用默认的序列化方式,对a对象的非transient实例变量进行序列化 ObjectInputStream采用默认的反序列化方式,对a对象的非transient实例变量进行反序列化
若是类a仅仅实现了Serializable接口,而且还定义了a对象的writeObject(ObjectOutputStream out) 和 readObject(ObjectInputStream in),则 ObjectOutputStream调用a对象的writeObject(ObjectOutputStream out)的方法进行序列化 ObjectInputStream调用a对象的readObject(ObjectInputStream in)的方法进行序列化
若是a类实现了ExternaInalizable接口,且User类必须实现readExternam(ObjectInput in)和 wiriteExternal(ObjectOutput out)方法,则 ObjectOutputStream调用a对象的wiriteExternal(ObjectOutput out)的方法进行序列化
ObjectInputStream调用a对象的readExternam(ObjectInput in)的方法进行序列化‘’
JDK类库中序列化的步骤

1–建立一个对象输出流,它能够包装一个奇特类型的目标输出流,如文件输出流:
objectOutputStream oos=new objectOutputStream(new FileOutStream(c:\object.out));
2–经过对象输出流writeObject()方法写对象:
oos.writeObject(new a(“xiaoxiao”,“145263”,“female”));

JDK类库中反序列化的步骤
1–建立一个对象输入流,它能够包装一个其余类型输入流,如文件输入流: objectInputStream ois=new ObjectInputStream(new FileInputStream(“object.out”));

2–经过对象输出流的readObject()方法读取对象:
a aa=(a)ois.readObject();

3–为了正确读数据,完成反序列化,必须保证向对象输出流写对象的顺序与从对象输入流中读对象的顺序一致

六 案例

import java.io.Serializable;
 
public class User implements Serializable {   
    public User(String string, String string2, String string3) {       
          // TODO Auto-generated constructor stub 
               }       
               private String userName;       
               private String password;      
               private String sex;              
               public String getUserName(String userName) {              
               return userName;      
               }       
               public String getPassword(String password) {             
               return password;      
               }       
               public String getSex(String sex) {             
               return sex;       
               } 
   }
import java.io.FileInputStream;
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream; 
import java.io.Serializable;
 
 
public class SerialDemo {       
          public static void main(String[] args) throws IOException,ClassNotFoundException{
          FileOutputStream fos =new FileOutputStream("object.out");             
          ObjectOutputStream oos=new ObjectOutputStream(fos);              
          User user1=new User("xiaoming","145263","female");              
          oos.writeObject(user1);              
          System.out.print(oos);             
          oos.flush();              
          oos.close();                             
          FileInputStream fis=new FileInputStream("object.out");              
          ObjectInputStream ois=new ObjectInputStream(fis);              
          User user2=(User) ois.readObject(); 
          System.out.print(user2.getUserName("xiaoming")+" "+ 
          user2.getPassword("145263")+" " + user2.getSex("female"));       
          } 
  }