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

可序列化类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;
}
}
/**
* 作者: 最近想跳河 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;
}
}
二、序列化与反序列化操作

序列化与反序列化操作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类型的实例
}
}
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类型的实例
}
}
三、调用序列与反序列方法

调用序列与反序列方法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;
}
}
/**
* @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;
}
}
本文详细介绍了如何在Java中实现对象的序列化与反序列化,包括定义可序列化类、序列化与反序列化操作及其实现代码。

被折叠的 条评论
为什么被折叠?



