Java序列化与反序列化【实例】

源:http://www.cnblogs.com/bluesky5304/archive/2010/04/07/1706061.html;纯理论难懂,于是结合实例,汇总后

基本概念

序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。

序列化为一般文件,也序列化为XML文件(使用XStream)

用于序列化的实体类Person.java 代码如下(记得需要实现Serializable接口):

import java.io.Serializable;

@SuppressWarnings("serial")
public class Person implements Serializable{
    private String name;
    private int age;
    public Person(){
        
    }
    public Person(String str, int n){
        System.out.println("Inside Person's Constructor");
        name = str;
        age = n;
    }
    String getName(){
        return name;
    }
    int getAge(){
        return age;
    }
}
序列化、反序列化为一般的文件,SerializeToFlatFile.java类的代码如下:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;


public class SerializeToFlatFile {
    public static void main(String[] args) {
        SerializeToFlatFile ser = new SerializeToFlatFile();
        ser.savePerson();
        ser.restorePerson();        
    }
    
    public void savePerson(){
        Person myPerson = new Person("Jay",24);
        try {
            FileOutputStream fos = new FileOutputStream("E:\\workspace\\2010_03\\src\\myPerson.txt");
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            System.out.println("Person--Jay,24---Written");
            System.out.println("Name is: "+myPerson.getName());
            System.out.println("Age is: "+myPerson.getAge());
            
            oos.writeObject(myPerson);
            oos.flush();
            oos.close();
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }
    
    public void restorePerson() {
        try {
            FileInputStream fis = new FileInputStream("E:\\workspace\\2010_03\\src\\myPerson.txt");
            ObjectInputStream ois = new ObjectInputStream(fis);
            
            Person myPerson = (Person)ois.readObject();
            System.out.println("\n--------------------\n");
            System.out.println("Person--Jay,24---Restored");
            System.out.println("Name is: "+myPerson.getName());
            System.out.println("Age is: "+myPerson.getAge());
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }
}

运行结果为(console输出),当然可以查看到myPerson.txt文件已经生成:
Inside Person's Constructor
Person--Jay,24---Written
Name is: Jay
Age is: 24


--------------------


Person--Jay,24---Restored
Name is: Jay

Age is: 24


控制对象的序列化和反序列化


前篇例子transit变量和类变量(static)不被序列化,还有种灵活的控制对象序列化和反序列方法。控制序列化就是有选择的序列化对象,不是所有内容都序列化,可储存其他非this对象包含的数据
 
接口 java.io.Externalizable 。当对象实现了这个接口时,就可以灵活的控制它的序列化和反序列过程,这个接口继承了java.io.Serializable
 
Externalizable 接口定义了两个方法,writerExternal方法在序列化时被调用,可以再该方法中控制序列化内容,readExternal方法在反序列时被调用,可以在该方法中控制反序列的内容
 

实例:UserInfo

import java.io.*;   
import java.util.*;   
  
//本程序通过实现Externalizable接口控制对象序列化和反序列   
public class UserInfo implements Externalizable {   
    public String userName;   
    public String userPass;   
    public int userAge;   
  
    public UserInfo(){   
    }   
  
    public UserInfo(String username,String userpass,int userage){   
        this.userName=username;   
        this.userPass=userpass;   
        this.userAge=userage;   
    }   
       
    //当序列化对象时,该方法自动调用   
    public void writeExternal(ObjectOutput out) throws IOException{   
        System.out.println("现在执行序列化方法");   
        //可以在序列化时写非自身的变量   
        Date d=new Date();   
        out.writeObject(d);   
        //只序列化userName,userPass变量   
        out.writeObject(userName);   
        out.writeObject(userPass);   
    }   
  
    //当反序列化对象时,该方法自动调用   
    public void readExternal(ObjectInput in) throws IOException,ClassNotFoundException{   
        System.out.println("现在执行反序列化方法");   
        Date d=(Date)in.readObject();   
        System.out.println(d);   
        this.userName=(String)in.readObject();   
        this.userPass=(String)in.readObject();   
    }   
  
    public String toString(){   
        return "用户名: "+this.userName+";密码:"+this.userPass+   
            ";年龄:"+this.userAge;   
    }   
}  
改写测试类

import java.io.ObjectOutputStream;   
import java.io.ObjectInputStream;   
import java.io.FileInputStream;   
import java.io.FileOutputStream;   
import java.util.Date;   
import java.lang.management.*;   
public class Test {   
  
  
  
    //序列化对象到文件   
    public static void serialize(String fileName){   
        try  
        {   
            //创建一个对象输出流,讲对象输出到文件   
            ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream(fileName));   
  
            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));   
  
            //读取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 22:18:12 CST 2008
用户名: renyanwei;密码:888888;年龄:0
反序列化完毕



  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
序列化(Serialization)是指将对象转换为字节流的过程,以便于存储或传输。反序列化(Deserialization)则是将字节流转换为对象的过程。 以下是一个使用 Java 进行序列化反序列化的示例: ```java import java.io.*; class MyClass implements Serializable { private static final long serialVersionUID = 1L; public int num; public String str; public MyClass(int num, String str) { this.num = num; this.str = str; } } public class SerializationExample { public static void main(String[] args) { // 创建对象 MyClass obj = new MyClass(123, "Hello World!"); // 序列化对象 try { FileOutputStream fileOut = new FileOutputStream("object.ser"); ObjectOutputStream out = new ObjectOutputStream(fileOut); out.writeObject(obj); out.close(); fileOut.close(); System.out.println("对象已序列化并保存到 object.ser 文件"); } catch (IOException e) { e.printStackTrace(); } // 反序列化对象 MyClass newObj = null; try { FileInputStream fileIn = new FileInputStream("object.ser"); ObjectInputStream in = new ObjectInputStream(fileIn); newObj = (MyClass) in.readObject(); in.close(); fileIn.close(); } catch (IOException e) { e.printStackTrace(); return; } catch (ClassNotFoundException e) { e.printStackTrace(); return; } // 输出反序列化后的对象内容 System.out.println("反序列化后的对象内容:"); System.out.println("num: " + newObj.num); System.out.println("str: " + newObj.str); } } ``` 在上述示例中,`MyClass` 类实现了 `Serializable` 接口,这个接口没有任何方法,只是一个标记接口,表示该类可以被序列化。 首先,我们创建了一个 `MyClass` 对象并给它赋值。然后,使用 `FileOutputStream` 和 `ObjectOutputStream` 将对象序列化并保存到文件 `object.ser` 中。 接下来,使用 `FileInputStream` 和 `ObjectInputStream` 从文件中读取字节流,并将其反序列化为新的 `MyClass` 对象。 最后,我们输出反序列化后的对象内容,可以看到它与原始对象的内容相同。 需要注意的是,序列化反序列化的类必须具有相同的 serialVersionUID 值,否则在反序列化时可能会出现 `InvalidClassException` 异常。在示例中,我们手动指定了 serialVersionUID 为 1L。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值