当前位置:美高梅官方网站59599 > 关于计算机 > Java基础学习总结——Java对象的序列化和反序列化

Java基础学习总结——Java对象的序列化和反序列化

文章作者:关于计算机 上传时间:2019-10-09
  • Java种类化的三种办法以及类别化的成效
  • Java基础学习计算——Java对象的系列化和反种类化

Java连串化与反类别化是什么样?为啥必要种类化与反体系化?怎么样贯彻Java种类化与反连串化?以下内容将围绕这么些主题材料开展张开探究。

  1. Java系列化与反连串化

    粗略的话Java体系化是指把Java对象转变为字节种类的进度;而Java反种类化是指把字节体系复苏为Java对象的历程。

  2. 为啥需求种类化与反类别化

    我们领悟,当七个进度展开远程通讯时,能够并行发送各体系型的数量,包含文件、图片、音频、录制等, 而这么些数据都会以二进制种类的款型在互联网上传递。那么当多个Java进度展开通讯时,能或不能够落实进程间的靶子传递呢?答案是可以的。如何成功呢?那就要求Java种类化与反类别化了。换句话说,一方面,发送方必要把这几个Java对象调换为字节体系,然后在互联网上传递;另一方面,接收方须要从字节类别中还原出Java对象。
    当大家清楚了为啥供给Java连串化和反体系化后,我们很自然地会想Java连串化的裨益。其好处一是达成了数量的长久化,通过连串化能够把数据长久地保存到硬盘上(平时存放在文书里),二是,利用系列化完结远程通讯,即在互连网上传递对象的字节连串。

3.什么样促成Java系列化与反体系化

  1. JDK类库中连串化API

    java.io.ObjectOutputStream:表示对象输出流,它的writeObject(Object obj)方法可以对参数钦赐的obj对象实行体系化,并把获得的字节连串写到三个指标输出流中。

    java.io.ObjectInputStream:表示对象输入流,它的readObject()方法从输入流中读取字节系列,再把它们反类别化成为一个对象,并将其归来。

  2. 完结体系化的渴求

    只有完毕了Serializable或Externalizable接口的类的靶子技艺被种类化,不然抛出至极。

  3. 兑现Java对象系列化与反系列化的章程

    一经贰个Student类,它的靶子要求类别化,能够有如下三种办法:

    方法一:若Student类仅仅完毕了Serializable接口,则可以依照以下办法开展种类化和反连串化。

    ObjectOutputStream选拔私下认可的种类化格局,对Student对象的非transient的实例变量实行系列化。

    ObjcetInputStream接纳私下认可的反类别化格局,对对Student对象的非transient的实例变量进行反系列化。

    方法二:若Student类仅仅达成了Serializable接口,何况还定义了readObject(ObjectInputStream in)和writeObject(ObjectOutputSteam out),则使用以下措施张开连串化与反种类化。

    ObjectOutputStream调用Student对象的writeObject(ObjectOutputStream out)的不二诀要实行连串化。

    ObjectInputStream会调用Student对象的readObject(ObjectInputStream in)的办法举行反系列化。

    方法三:若Student类达成了Externalnalizable接口,则Student类必需贯彻readExternal(ObjectInput in)和writeExternal(ObjectOutput out)方法,则依照以下情势进行连串化与反连串化。

    ObjectOutputStream调用Student对象的writeExternal(ObjectOutput out))的方法开展类别化。

    ObjectInputStream会调用Student对象的readExternal(ObjectInput in)的点子开展反系列化。

  4. JDK类库中连串化的步子

    步骤一:创制三个对象输出流,它能够打包三个其它项指标对象输出流,如文件输出流:

    ObjectOutputStream out = new ObjectOutputStream(new fileOutputStream("D:\objectfile.obj"));
    

    步骤二:通过对象输出流的writeObject()方法写对象:

    out.writeObject("hello");
    out.writeObject(new Date());
    
  5. JDK类库中反种类化的手续

    步骤一:创造八个对象输入流,它能够打包三个任何项目输入流,如文件输入流:

    ObjectInputStream in = new ObjectInputStream(new fileInputStream(“D:\objectfile.obj”));
    

    步骤二:通过对象输出流的readObject()方法读取对象:

    String obj1 = (String)in.readObject();
    Date obj2 = (Date)in.readObject();
    

    须求小心的是,为了科学读取数据,达成反连串化,必须确定保证向指标输出流写对象的依次与从指标输入流中读对象的依次一致。

为了更加好地精晓Java体系化与反连串化,选用情势一编码达成。

Student类定义如下:

package com.jieke.io; 

import java.io.Serializable;  

    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;  
     }  
    }  

把Student类的对象类别化到文件F:\Java\com\jieke\io\student.txt,并从该公文中反系列化,向console展现结果。代码如下:

import java.io.*;  

public class UseStudent  
{  
 public static void main(String[] args)  
 {  
  Student st = new Student("Tom",'M',20,3.6);  
  File file = new File("F:\Java\com\jieke\io\student.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. Java类别化正是把指标调换到字节种类,而Java反种类化便是把字节系列还原成Java对象。
  2. 使用Java体系化与反连串化才具,一是足以兑现多少的长久化,在MVC格局中十分有用;二是足以用来对象数据的远程通讯。

回去目录|·(工)·)

本文由美高梅官方网站59599发布于关于计算机,转载请注明出处:Java基础学习总结——Java对象的序列化和反序列化

关键词: