Java的序列化与反序列化

本文详细介绍了如何在Java中实现对象的序列化与反序列化,包括定义可序列化类、序列化与反序列化操作及其实现代码。

一、定义可以被序列化的类

 

ExpandedBlockStart.gif可序列化类
import java.io.Serializable;

/**
 * 作者: 最近想跳河  2011年7月20日
 * 声明类SerializableClass继承Serializable接口,此类可被序列化
 
*/
public class SerializableClass implements Serializable {
    private String serverName;
    private String serverPort;
    private String databaseName;
    private String user;
    private String password;
    
    /**
     * 构造方法,初始化私有字段,私有字段是可被序列化的
     * 
@param serverName 服务器名称
     * 
@param serverPort 服务器的端口
     * 
@param databaseName 数据库名称 
     * 
@param user 用户名
     * 
@param password 密码
     
*/
    public SerializableClass(String serverName, String serverPort,
            String databaseName, String user, String password) {
        this.serverName = serverName;
        this.serverPort = serverPort;
        this.databaseName = databaseName;
        this.user = user;
        this.password = password;
    }
    
    /**
     * 重载toString()方法
     * 这是这个可被序列化类的一个方法
     * 方法是不能被序列化的
     
*/
    public @Override  String  toString(){//以下是JDBC连接SQL Server数据库的写法
        String str = null;
        str = "jdbc:sqlserver://"+this.serverName+":"+this.serverPort+";" +
                   "databaseName="+this.databaseName+";"+
                "user="+this.user+";"+"password="+this.password+";";
        return str;
    }
}

 

 

二、序列化与反序列化操作

 

ExpandedBlockStart.gif序列化与反序列化操作
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

/** 最近想跳河  **
 * 序列化与反序列化类 ,包含两个静态方法serialize(序列化)和deserialize(反序列化)
 * 序列化从对象到文件,反序列化从文件到对象
 * 序列化和反序列化就像是从一个池子向另一个池子注水(不知道是不是水也许是油,不管怎样都是能流动的东西)
 * 步骤     1、联通管道      2、安装水泵        3、开始抽水     4、完成抽水      5、撤泵     6、撤管
 * 管道:FileInputStream、FileOutputStream
 * 水泵:ObjectInputStream、ObjectOutputStream
 * 水:Object类型的实例,也就是对象。
 * 序列化是我的池子里面有水而对那个池子没水,我给它水
 * 反序列化是那个池子有水而我的池子没水,它给我水,我的池子是空的
 * 序列化与反序列化的执行过程虽然像注水,但是实际上是对象的(类的实例)的深度复制
 * 序列化是我给另一个地方注水,但是我的水并没有减少
 * 反序列化是我取另一个地方的水,但那个地方的水也没有减少
 
*/
public class SdSerialize {

    /**
     * 静态序列化方法
     * 
@param obj 被序列化的类的实例
     * 
@param filePath 序列化类的实例存放的文件路径
     * 
@throws Exception 抛出异常
     
*/
    public static void serialize(Object obj,String filePath) throws IOException {
        //联通向外输水管道,我要输出的地方我当然知道,但是个什么液体我不太清楚我不关心,关键是我这里有水(实例 obj)
        FileOutputStream fos = new FileOutputStream(filePath);//声明文件输出流,在指定位置创建文件
        
//安装个水泵,水泵安装到什么地方?当然是在输出管道上了。什么类型的水泵?输出水泵
        ObjectOutputStream oos = new ObjectOutputStream(fos);//序列化输出流,将任何实例作为Object类型输出
        
//开始抽水了直到把水都抽走
        oos.writeObject(obj);//向指定的路径以流的形式写入对象
        
//关掉水泵
        oos.close();//关闭序列化输出流
        
//拆除管道
        fos.close();//关闭文件输出流
    }
    
    /**
     * 静态反序列化方法
     * 
@param filePath 反序列化类实例存放的文件路径
     * 
@return 返回Object类型的实例
     * 
@throws ClassNotFoundException 
     * 
@throws Exception 抛出异常
     
*/
    public static Object deserialize(String filePath) throws IOException, ClassNotFoundException{
        //我的池子现在的情况就是没有水(对象或者说是某个类的实例)
        Object obj = null;//反序列化取得类的实例
        
//开启取水管道,当然需要知道取水的地方在哪里
        FileInputStream fis = new FileInputStream(filePath);//声明文件输入流,锁定文件路径
        
//安装个水泵,水泵安装到什么地方?当然是在输入管道上了。什么类型的水泵?输入水泵
        ObjectInputStream ois = new ObjectInputStream(fis);//序列化输入流,将文件中的内容作为Object类型输入
        
//抽水回来了(对象,类的实例),抽的水放在哪里?当然是我的水池里面了
        obj = ois.readObject();//从指定的路径以流的形式读取对象
        
//关掉水泵
        ois.close();//关闭序列化输入流
        
//拆除管道
        fis.close();//关闭文件输入流
        return obj;//返回Object类型的实例
    }
}

 

三、调用序列与反序列方法

 

ExpandedBlockStart.gif调用序列与反序列方法
public class Main {

    /**
     * 
@param args
     
*/
    public static void main(String[] args) throws Exception {
        SerializableClass serClass = deserializeFunction();//反序列化
        serializeFunction();//序列化
        System.out.print(serClass.toString());//字符串輸出
    }

    private static void serializeFunction() throws Exception {
        String serverName = "(localhost)";
        String serverPort = "1433";
        String databaseName = "NorthWind";
        String user = "sa";
        String password = "mawendong";
        SerializableClass serClass = new SerializableClass(serverName,
                serverPort, databaseName, user, password);
        SdSerialize.serialize(serClass, "c:\\temp.txt");
    }

    private static SerializableClass deserializeFunction() {
        SerializableClass serClass = null;
        try {
            serClass = (SerializableClass) SdSerialize
                    .deserialize("c:\\temp.txt");
        } catch (Exception ex) {
            throw (new MyException(ex.getMessage(), ex));
        }
        return serClass;
    }
}

 

转载于:https://www.cnblogs.com/ponyblog/archive/2012/01/02/2310195.html

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值