对象序列化与反序列化

Posted starskyhu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对象序列化与反序列化相关的知识,希望对你有一定的参考价值。

1)要想让一个对象成为序列化对象,那么这个类就要实现Serializable或Externalizable接口(Externalizable接口继承与Serializable接口),

这种序列化仅对对象的 非transient 的实例变量进行序列化不会对静态成员变量序列化,也不会对方法序列化

 

2)

对象序列化:把java“对象”转换成“字节序列”的过程称为对象序列化

对象反序列化:把“字节序列”恢复成java“对象”的过程称为反序列化

在反序列化时不会调用类的任何构造方法

 

3)

对象序列化的功能描述:

1.把对象转换成字节的方式存到硬盘上去,通常存放在一个文件中,当你打开这个文件时有点乱码,但也可以看到相应信息

2.在网络上传递对象的字节序列

 

具体例子:

 

[java] view plain copy
  1. import java.io.Serializable ;  
  2. import java.io.ObjectOutputStream ;  
  3. import java.io.FileOutputStream ;  
  4. import java.io.* ;  
  5.   
  6. //对象序列化 与 反序列化  
  7.   
  8. public class SerializableTest  
  9. {  
  10.     public static void main(String[] args)  
  11.     {  
  12.         Person p = new Person("小明",20,172.0) ;  
  13.         Person p2 = new Person("小红",19,165.0) ;  
  14.         Person p3 = new Person("小花",21,168.0) ;  
  15.         try  
  16.         {  
  17.             FileOutputStream fos = new FileOutputStream("e:/abc/person.txt") ;  
  18.             //实现对象序列化,把对象以 字节流的方式 写进文件中  
  19.             ObjectOutputStream oos = new ObjectOutputStream(fos) ;  
  20.             //对象序列化 只可以把 ”非静态的成员变量“写到流中,静态的成员变量;或者方法都不可以写到流中  
  21.             oos.writeObject(p);  
  22.             oos.writeObject(p2);  
  23.             oos.writeObject(p3);  
  24.   
  25.             oos.close() ;  
  26.               
  27.             //反序列化,把文件中的对象写回到程序(内存)中  
  28.             FileInputStream fis = new FileInputStream("e:/abc/person.txt") ;  
  29.             ObjectInputStream ois = new ObjectInputStream(fis) ;  
  30.   
  31.             Person pe1 = (Person)ois.readObject() ;  
  32.             Person pe2 = (Person)ois.readObject() ;  
  33.             Person pe3 = (Person)ois.readObject() ;  
  34.   
  35.             System.out.println(pe1.name+", " + pe1.age + ", " + pe1.height);  
  36.             System.out.println(pe2.name+", " + pe2.age + ", " + pe2.height);  
  37.             System.out.println(pe3.name+", " + pe3.age + ", " + pe3.height);  
  38.   
  39.             ois.close() ;  
  40.               
  41.         }  
  42.         catch (Exception e)  
  43.         {  
  44.             e.printStackTrace() ;  
  45.         }  
  46.           
  47.   
  48.     }  
  49. }  
  50.   
  51. class Person implements Serializable //该对象实现了Serializable接口,则该类是序列化对象  
  52. {  
  53.     String name ;  
  54.     int age ;  
  55.     double height ;  
  56.   
  57.     public Person(String name, int age, double height)  
  58.     {  
  59.         this.name = name ;  
  60.         this.age = age ;  
  61.         this.height = height ;  
  62.     }  
  63. }  

 

 

如果用户希望控制类的序列化方式,可以在可序列化类中提供以下形式的writeObject()和readObject()方法,可以参考api。

private void writeObject(java.io.ObjectOutputStream out) throws IOException
private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException

以上是关于对象序列化与反序列化的主要内容,如果未能解决你的问题,请参考以下文章

java 对象序列化与反序列化

java对象的序列化与反序列化

对象序列化与反序列化

Java学习笔记6.3.3 文件操作 - 对象序列化与反序列化

Java学习笔记6.3.3 文件操作 - 对象序列化与反序列化

个人浅析Hadoop序列化与反序列化