Java序列化与反序列化讲解

首先解释两个概念,何为序列化?何为反序列化?

  序列化:将对象转化成流的过程称为序列化

  反序列化:将流转化成对象的过程称之为反序列化

  序列化与反序列化必须遵守的原则

  a) Java对象

  在java中要想使一个java对象可以实现序列化与反序列化,必须让该类实现java.io.Serializable接口

  java.io.Serializable接口定义如下:

  publicinterface Serializable {

  }

  从上述定义中可以看到该接口中未定义任何方法,这大大的简化了开发者

  b) 序列化主要依赖java.io.ObjectOutputStream类,该类对java.io.FileOutputStream进一步做了封装,这里主要使用ObjectOutputStream类的writeObject()方法实现序列化功能

  Demo:

  /**

  *将对象序列化到磁盘文件中

  *@paramo

  *@throwsException

  */

  publicstaticvoid writeObject(Object o) throws Exception{

  File f=new File("d:""user.tmp");

  if(f.exists()){

  f.delete();

  }

  FileOutputStream os=new FileOutputStream(f);

  //ObjectOutputStream 核心类

  ObjectOutputStream oos=new ObjectOutputStream(os);

  oos.writeObject(o);

  oos.close();

  os.close();

  }

  c) 反序列化主要依赖java.io.ObjectInputStream类,该类对java.io.InputStream进一步做了封装,这里主要使用ObjectInputStream类的readObject()方法实现序列化功能

  Demo:

  /**

  *反序列化,将磁盘文件转化为对象

  *@paramf

  *@return

  *@throwsException

  */

  publicstatic User readObject(File f) throws Exception{

  InputStream is=new FileInputStream(f);

  //ObjectOutputStream 核心类

  ObjectInputStream ois=new ObjectInputStream(is);

  return (User)ois.readObject();

  }

  贴出完整的demo

  Java对象:

  package com.io.bean;

  import java.io.Serializable;

  publicclass User implements Serializable {

  privateintuserId;

  private String userName;

  private String userSex;

  privateintuserAge;

  publicint getUserAge() {

  returnuserAge;

  }

  publicvoid setUserAge(int userAge) {

  this.userAge = userAge;

  }

  publicint getUserId() {

  returnuserId;

  }

  publicvoid setUserId(int userId) {

  this.userId = userId;

  }

  public String getUserName() {

  returnuserName;

  }

  publicvoid setUserName(String userName) {

  this.userName = userName;

  }

  public String getUserSex() {

  returnuserSex;

  }

  publicvoid setUserSex(String userSex) {

  this.userSex = userSex;

  }

  @Override

  public String toString() {

  returnthis.getUserId() + " " + this.getUserName() + " "

  + this.getUserSex() + " " + this.getUserAge();

  }

  }

  序列化与反序列化

  package com.io.test;

  import java.io.File;

  import java.io.FileInputStream;

  import java.io.FileOutputStream;

  import java.io.InputStream;

  import java.io.ObjectInputStream;

  import java.io.ObjectOutputStream;

  import com.io.bean.User;

  publicclass TestSerializable {

  /**

  *将对象序列化到磁盘文件中

  *@paramo

  *@throwsException

  */

  publicstaticvoid writeObject(Object o) throws Exception{

  File f=new File("d:""user.tmp");

  if(f.exists()){

  f.delete();

  }

  FileOutputStream os=new FileOutputStream(f);

  //ObjectOutputStream 核心类

  ObjectOutputStream oos=new ObjectOutputStream(os);

  oos.writeObject(o);

  oos.close();

  os.close();

  }

  /**

  *反序列化,将磁盘文件转化为对象

  *@paramf

  *@return

  *@throwsException

  */

  publicstatic User readObject(File f) throws Exception{

  InputStream is=new FileInputStream(f);

  //ObjectOutputStream 核心类

  ObjectInputStream ois=new ObjectInputStream(is);

  return (User)ois.readObject();

  }

  publicstaticvoid main(String[] args) throws Exception{

  /*****************将对象序列化***************/

  /*

  User user=new User();

  user.setUserId(1);

  user.setUserName("张艺谋");

  user.setUserSex("男");

  user.setUserAge(50);

  TestSerializable.writeObject(user);

  */

  /*****************将对象序反列化***************/

  User user=TestSerializable.readObject(new File("d:""user.tmp"));

  System.out.println(user);

  }

  }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值