Java中对象序列化与反序列化

在Java中有时候会用到序列化和反序列化。下面做一个简单的介绍

对象序列化(Serializable)是指将对象转换为字节序列的过程,而反序列化则是根据字节序列恢复对象的过程。

序列化一般用于以下场景:
1.永久性保存对象,保存对象的字节序列到本地文件中;
2.通过序列化对象在网络中传递对象;
3.通过序列化在进程间传递对象。
对象所属的类必须实现Serializable或是Externalizable接口才能被序列化(String、Date等已经默认实现了Serializable)。对实现了Serializable接口的类,其序列化与反序列化采用默认的序列化方式,Externalizable接口是继承了Serializable接口的接口,是对Serializable的扩展,实现了Externalizable接口的类完全自己控制序列化与反序列化行为。
Java.io.ObjectOutputStream代表对象输出流,其方法writeObject(Object obj)可以实现对象的序列化,将得到的字节序列写到目标输出流中。
Java.io.ObjectInputStream代表对象输入流,其readObject()方法能从源输入流中读取字节序列,将其反序列化为对象,并将其返回。


下面是一个简单的Example:

import java.io.Serializable;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.FileInputStream;
import java.util.Date;
import java.io.ObjectOutputStream;
import java.io.ObjectInputStream;
public class javaSerializable_fun {
/**
   * java.io.Serializable 接口,类只有实现Serializable借口才能被序列化
   * java.io.Externalizable接口,利用java的序列化和反序列化工具,很多存储和恢复对象的工作都可以自动完成。
   * java.io.ObjectOutput接口,序列化传出, 继承了DataOutput接口并定义了一些方法,它支持对象序列化;
   *   重点说明:在该类中,writeObject()方法是最重要的方法,用于对象序列化,如果对象包含其他的对象引用,则writeObject()方法地柜序列化这些对象;
   * java.io.ObjectOutputStream类,负责向流中写入对象,构造方法:ObjectOutputStream(OutputStream out);
   * java.io.ObjectInput接口,序列化传入。继承了DataInput接口并定义了一些方法,它支持对象序列化;
   * ObjectInputStream类, 负责向从流中读取对象,构造方法:ObjectInputStream(InputStream out);
   ***/
public static void main(String[] args)throws Exception {
    try
  {
   //构造FileOutputStream对象
   FileOutputStream f=new FileOutputStream("Serializable.txt");

   //构造ObjectOutputStream对象
   ObjectOutputStream out=new ObjectOutputStream(f);

   Customer customer=new Customer("JackMa",50);

   //使用ObjectOutputStream对象的writeObject()方法进行序列化
   out.writeObject(customer);

   out.writeObject("Today");
   out.writeObject(new  Date ());

   //关闭ObjectOutputStream对象
   out.close();

   //关闭FileOutputStream对象
     f.close();
     System.out.println("序列化完毕!");

    FileInputStream  in = new  FileInputStream ("Serializable.txt" );
    ObjectInputStream  s = new  ObjectInputStream (in);
    Customer test = (Customer) s.readObject();
    String  today = (String )s.readObject();
    Date  date = (Date )s.readObject();
    System.out.println("反序列化完毕!");
    System.out.println(test.toString());
    System.out.println(today +":"+ date);
    //关闭文件对象
    s.close();
    in.close();
  }
  catch(IOException e)
  {
   e.getStackTrace();
  }
}
}

class Customer implements Serializable
{
 private static final long serialVersionUID =1L;

 private String name;
 private int age;

 public String getName()
 {
  return name;
 }

 public int getAge()
 {
  return age;
 }

 public Customer(String name,int age)
 {
  this.name=name;
  this.age=age;
 }
public String toString()
 {
  return "name="+ name +",age="+age;
 }
}

 

运行结果如下:

我们查看Serializable.txt文件中序列化后的结果,如下图:



值得注意的是,反序列化时读取文件的顺序,一定要和序列化的时候一致。不然会出现 ****cannot cast to****的错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值