java序列化

java序列化

java 提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。

将序列化对象写入文件后,可以从文件中读取出来,并且对它进行反序列化,也就是说,对象的类型信息、对象的数据,还有对象中数据类型可以用来在内存中新建对象。整个过程都是jvm独立的,在一个平台中序列化的对象可以在另一个平台反序列化恢复该对象。

类 ObjectInputStream 和 ObjectOutputStream 是高层次的数据流,他们包含序列化和反序列对象的方法。

两个特别的方法

public final void writeObject(Object x) throws IOException

ObjectOutputStream类 序列化一个对象并将他发送到输出流。

public final Object readObject() throws IOException,ClassNotFoundException

ObjectInputStream类 从流中读取一个对象,并将对象反序列化。返回Object,因此,你需要将它转为合适的数据类型。

示例

public class Employee implements java.io.Serializable
{
   public String name;
   public String address;
	// 标记短暂,不参加序列化
   public transient int SSN;
   public int number;
   public void mailCheck()
   {
      System.out.println("Mailing a check to " + name
                           + " " + address);
   }
}

需要注意的是,一个类的对象想要序列化成功,必须要实现java.io.Serializable接口,且该类的所有属性必须是可序列化的。如果有一个属性不是可序列化的,则该属性必须标注是短暂的。

序列化对象

执行一个程序,创建一个名为 employee.ser 文件。该程序没有任何输出。

public static void main(String [] args)
{
  Employee e = new Employee();
  e.name = "Reyan Ali";
  e.address = "Phokka Kuan, Ambehta Peer";
  e.SSN = 11122333;
  e.number = 101;
  try
  {
     FileOutputStream fileOut = new FileOutputStream("/tmp/employee.ser");
     ObjectOutputStream out = new ObjectOutputStream(fileOut);
     out.writeObject(e);
     out.close();
     fileOut.close();
     System.out.printf("Serialized data is saved in /tmp/employee.ser");
  }catch(IOException i){
      i.printStackTrace();
  }
}

反序列化对象

程序实现将 /tmp/employee.ser 存储的 Employee 对象反序列化

public static void main(String [] args)
{
  Employee e = null;
  try
  {
     FileInputStream fileIn = new FileInputStream("/tmp/employee.ser");
     ObjectInputStream in = new ObjectInputStream(fileIn);
     e = (Employee) in.readObject();
     in.close();
     fileIn.close();
  }catch(IOException i){
     i.printStackTrace();
     return;
  }catch(ClassNotFoundException c){
     System.out.println("Employee class not found");
     c.printStackTrace();
     return;
  }
  System.out.println("Deserialized Employee...");
  System.out.println("Name: " + e.name);
  System.out.println("Address: " + e.address);
  System.out.println("SSN: " + e.SSN);
  System.out.println("Number: " + e.number);
}

对于 jvm 可以反序列化对象,但是它必须能找到字节码的类,如果找不到,则抛出 ClassNotFoundException 异常。

简单谈应用

网络信息传输,数据信息的持久化,session信息的存储等等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值