java序列化java.io.Serializable

在JAVA中,一个大的应用程序需要保存很多对象的时候,由于虚拟机内存有限,(资源宝贵啊  )有时不可能所有有用的对象都放到内存中,因此,需要将不常用的对象暂时持久化的文件中,当需要这个对象时,再从文件把对象恢复到内存中,这就是所谓对象的序列化和反序列化。本文讲实现如何将对象序列化到文件,然后再从文件反序列化到对象,你会发现其实特别简单 



先看一下对象的序列化和反序列化的关键是什么 

1,首先被序列化的对象必须实现 java.io.Serializable 接口,咳~~咳~~,其实这个接口没定义任何方法 



2,序列化时,需要用到对象输出流ObjectOutputStream ,然后通过文件输出流构造 ObjectOutputStream 对象调用writeObject写入到文件 



3,反之,反序列化时用到对象输入流ObjectIntputStream,  然后通过文件输出流构造 ObjectIntputStream对象调用readObject加载到内存,注意,是返回万能Object类型 



4,注意:序列化时transient变量(这个关键字的作用就是告知JAVA我不可以被序列化)和静态变量不会被序列化(关于静态变量不会序列化保留意见,本实例先不用静态变量) 



5,也是最应该注意的,如果你先序列化对象A后序列化B,那么在反序列化的时候一定记着JAVA规定先读到的对象是先被序列化的对象,不要先接收对象B,那样会报错 



好了,现在我们做一个实例,我们现在要序列化一个会员对象到文件里,然后再把它读出来 

先创建会员类 

Java代码 
import java.io.*;   
import java.util.*;   
  
//一定要实现Serializable接口才能被序列化   
public class UserInfo implements Serializable {   
    public String userName;   
    public String userPass;   
    //注意,userAge变量前面的transient   
    public transient int userAge;   
  
    public UserInfo(){   
    }   
  
    public UserInfo(String username,String userpass,int userage){   
        this.userName=username;   
        this.userPass=userpass;   
        this.userAge=userage;   
    }   
  
    public String toString(){   
        return "用户名: "+this.userName+";密码:"+this.userPass+   
            ";年龄:"+this.userAge;   
    }   
}  

import java.io.*; 
import java.util.*; 

//一定要实现Serializable接口才能被序列化 
public class UserInfo implements Serializable { 
public String userName; 
public String userPass; 
//注意,userAge变量前面的transient 
public transient int userAge; 

public UserInfo(){ 


public UserInfo(String username,String userpass,int userage){ 
this.userName=username; 
this.userPass=userpass; 
this.userAge=userage; 


public String toString(){ 
return "用户名: "+this.userName+";密码:"+this.userPass+ 
";年龄:"+this.userAge; 


接着我们开始写如何序列化和反序列化,初学认真看哦 

Java代码 
import java.io.*;   
import java.util.*;   
public class Test {   
  
    //序列化对象到文件   
    public static void serialize(String fileName){   
        try  
        {   
            //创建一个对象输出流,讲对象输出到文件   
            ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream(fileName));   
  
            out.writeObject("序列化日期是:");  //序列化一个字符串到文件   
  
            out.writeObject(new Date());    //序列化一个当前日期对象到文件   
  
            UserInfo user=new UserInfo("renyanwei","888888",20);   
            out.writeObject(user);  //序列化一个会员对象   
  
            out.close();   
        }   
        catch (Exception x)   
        {   
            System.out.println(x.toString());   
        }   
           
    }   
    //从文件反序列化到对象   
    public static void deserialize(String fileName){   
        try  
        {   
            //创建一个对象输入流,从文件读取对象   
            ObjectInputStream in=new ObjectInputStream(new FileInputStream(fileName));   
  
            //注意读对象时必须按照序列化对象顺序读,否则会出错   
            //读取字符串   
            String today=(String)(in.readObject());   
            System.out.println(today);   
  
            //读取日期对象   
            Date date=(Date)(in.readObject());   
            System.out.println(date.toString());   
  
            //读取UserInfo对象并调用它的toString()方法   
            UserInfo user=(UserInfo)(in.readObject());             
            System.out.println(user.toString());   
  
            in.close();   
        }   
        catch (Exception x)   
        {   
            System.out.println(x.toString());   
        }   
           
    }   
  
    public static void main(String[] args) {       
        serialize("D:\\test.txt");   
        System.out.println("序列化完毕");   
  
        deserialize("D:\\test.txt");   
        System.out.println("反序列化完毕");   
    }   
  
}  

import java.io.*; 
import java.util.*; 
public class Test { 

//序列化对象到文件 
public static void serialize(String fileName){ 
try 

//创建一个对象输出流,讲对象输出到文件 
ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream(fileName)); 

out.writeObject("序列化日期是:"); //序列化一个字符串到文件 

out.writeObject(new Date()); //序列化一个当前日期对象到文件 

UserInfo user=new UserInfo("renyanwei","888888",20); 
out.writeObject(user); //序列化一个会员对象 

out.close(); 

catch (Exception x) 

System.out.println(x.toString()); 



//从文件反序列化到对象 
public static void deserialize(String fileName){ 
try 

//创建一个对象输入流,从文件读取对象 
ObjectInputStream in=new ObjectInputStream(new FileInputStream(fileName)); 

//注意读对象时必须按照序列化对象顺序读,否则会出错 
//读取字符串 
String today=(String)(in.readObject()); 
System.out.println(today); 

//读取日期对象 
Date date=(Date)(in.readObject()); 
System.out.println(date.toString()); 

//读取UserInfo对象并调用它的toString()方法 
UserInfo user=(UserInfo)(in.readObject());
System.out.println(user.toString()); 

in.close(); 

catch (Exception x) 

System.out.println(x.toString()); 




public static void main(String[] args) {
serialize("D:\\test.txt"); 
System.out.println("序列化完毕"); 

deserialize("D:\\test.txt"); 
System.out.println("反序列化完毕"); 



运行结果: 


序列化完毕 
今天是: 
Thu Oct 23 18:31:11 CST 2008 
用户名: renyanwei;密码:888888;年龄:0 
反序列化完毕 

我们看代码总结一下,serialize方法实现了对象的序列化功能,讲对象序列化到文件,使用了文件的输出流ObjectOutputStream 的writerObject方法一次写入一个对象,对象在文件中按写入顺序存储。 

deserialize方法实现反序列化,从文件将对象反序列化到内存,使用了ObjectIntputStream 的readObject方法,因为序列化对象是按照写入顺序存储的,所以在反序列化时必须按照写入顺序读取 

大家看了结果就应该知道了,标明transit的实例变量是没被序列化进去的 ,呵呵 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值