对象序列化(串行化)的作用、使用

一、序列化的作用

序列化定义:将对象转换为二进制数据流( 操作目标是对象)。
作用:方便传输及保存,可以帮开发者完成保存和读取对象成员变量取值的过程。

关键点:

1.一 个类若想被序列化,则要实现java.io.serializable接口,该接口中没有定义任何方法,是一个标识符(maker interface),当一个类实现了该接口,表示该类是可以被序列化的。
2.在序列化时,static变量是无法序列化的;如果A包含了一个对B的引用,当A序列化的时候也将B一并的序列化;如果A可以序列化,B不可以序列化,则A序列化的时候将会发生异常,将B的引用设为transient,该关键字表示变量不会被序列化,这样A就可以被序列化了。 static和transient关键字修饰的变量、引用不可以被序列化。
3.如果一个类可以被序列化,其子类也可以被序列化;因为子类也继承了serializable接口。

二、序列化使用方法
1.首先介绍两个用于序列化操作的类:ObjectlnputStream与ObjectOutputStream

(1)ObjectOutputStream(序列化)——将对象保存在文件之中

java.lang.Object
  java.io.OutputStream
      java.io.ObjectOutputStream

public class ObjectOutputStream
 
 
  
  extends 
  
  OutputStream
 
 
 
 
  
  implements 
  
  ObjectOutput, 
  
  ObjectStreamConstants
 
 
 
 

 
 
 
 
  
  
  
  
构造方法摘要
protectedObjectOutputStream()            为完全重新实现 ObjectOutputStream 的子类提供一种方法,让它不必分配仅由 ObjectOutputStream 的实现使用的私有数据。
 ObjectOutputStream(OutputStream out)            创建写入指定 OutputStream 的 ObjectOutputStream。
(2)ObjectlnputStream(反序列化)——从文件读取已保存的对象
java.lang.Object
  java.io.InputStream
      java.io.ObjectInputStream

public class ObjectInputStream
    
    
     
     extends 
     
     InputStream
    
    
    
    
     
     implements
     
      ObjectInput, ObjectStreamConstants
    
    
    
    

    
    
构造方法摘要
protected ObjectInputStream()
          为完全重新实现 ObjectInputStream 的子类提供一种方式,让它不必分配仅由 ObjectInputStream 的实现使用的私有数据。
 ObjectInputStream(InputStream in)
          创建从指定 InputStream 读取的 ObjectInputStream。

2.序列化使用的读写方法

writeObject

public final void writeObject(Object obj)
                       throws IOException
将指定的对象写入 ObjectOutputStream

readObject

public final Object readObject()
                        throws IOException,
                               ClassNotFoundException
从 ObjectInputStream 读取对象

3.序列化步骤

(1)步骤1——对象实现Serializable

示例:
class Person implements Serializable
{
private String name;
private int age;

public Person(String name,int age)
{
this.name = name;
this.age = age;
}

public String toString()
{
return "姓名:"+this.name+",年龄:"+this.age;
}
}

(2)步骤2——使用ObjectOutputStream对对象进行序列化(序列化的内容是输出

public static void serialize(File f) throws Exception
{
OutputStream out = FileOutputStream(f);
ObjectOutputStream obj = new ObjectOutputStream(out); //把输出流out进行序列化
obj.writeObject(new Person("张三",30));
obj.close();
}

(3)步骤3——使用ObjectInputStream对对象进行反序列化(反序列化的内容是输入

public static void deserialize(File f) throws Exception
{
InputStream in = new FileInputStreanm(f);
ObjectInputStream obj = new ObjectInputStream(in);
Person p = (Person)obj.readObject();
System.out.println(p.toString());
}


4.程序完整示例

import java.io.*;


class Person implements Serializable
{
private String name;
private int age;


public Person(String name,int age)
{
this.name = name;
this.age = age;
}


public String toString()
{
return "姓名:"+this.name+",年龄:"+this.age;
}
}


public class PrintDemo  
{
public static void main(String[] args) throws Exception
{
File f = new File("g:\\1.txt");
serialize(f);
deserialize(f);


}


public static void serialize(File f) throws Exception
{
OutputStream out = new FileOutputStream(f);
ObjectOutputStream obj = new ObjectOutputStream(out); //把输出流out进行序列化
obj.writeObject(new Person("张三",30));
obj.close();
}


public static void deserialize(File f) throws Exception
{
InputStream in = new FileInputStream(f);
ObjectInputStream obj = new ObjectInputStream(in);
Person p = (Person)obj.readObject();
System.out.println(p.toString());
}
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值