Java对象序列化就那些实现了Serializable接口的对象转换成一个字节序列,并能够在以后将这个字节序列 完全恢复为原来的对象。这一过程甚至可以通过网络进行;运行Windows操作系统的计算机上创建的一个对象将其序列化,通过网络将它发送到一台运行 Unix系统的计算机,然后在那里准确地重新组装。Java序列化的一个引用就是RMI,当向远程对象发送消息,需要通过对象序列化来传输参数和返回值。 PS:通过序列化之后我们可以将对象保存到持久化的设备如文件、数据库
实现: 实现Serializable接口。这个接口是标记接口里面没有什么方法要实现的!然后使用一个输出流(如:FileOutputStream) 构造一个ObjectOutputStream(对象流)。然后用ObjectOutputStream的writeObject(Object obj)方法就可以将参数为obj 的对象写出保存其状态。如果要恢复的话就使用输入流实现!
1. 数据表结构 CREATE TABLE `obj` ( `id` int(11) NOT NULL auto_increment, `object` blob, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8; 2. 读写代码 package org.test; import java.io.*; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.sql.Blob; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Statement;
public class ObjectSerial { public static void main(String[] args) { //创建测试用对象 City beijing.setName("北京"); beijing.setCode("010"); City shanghai = shanghai.setName("上海"); shanghai.setCode("020"); City tianjin.setName("天津"); tianjin.setCode("021"); List<City> cityList = new ArrayList<City>(); cityList.add( cityList.add(shanghai); cityList.add( TestObject obj = new TestObject(); obj.setName("yangsq"); obj.setPassword("111"); obj.setDate(new Date()); obj.setCityList(cityList); try{ //将对象存入blob字段 Class.forName("com.mysql.jdbc.Driver"); Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "321"); con.setAutoCommit(false); //将一个对象序列化保存到数据库 PreparedStatement pstmt = con.prepareStatement("insert into obj (object) values (?)"); pstmt.setObject(1, obj); pstmt.executeUpdate(); con.commit(); //从数据库中提取记录 Statement state = con.createStatement(); ResultSet rs = state.executeQuery("select object from obj"); if (rs.next()) { //以下是读取的方法一定要注意了! Blob inblob = (Blob) rs.getBlob("object"); InputStream is = inblob.getBinaryStream(); BufferedInputStream input = new BufferedInputStream(is); byte[] buff = new byte[(int) inblob.length()];//放到一个buff 字节数组 while(-1 != (input.read(buff, 0, buff.length))); ObjectInputStream in =new ObjectInputStream(new ByteArrayInputStream(buff)); TestObject w3 = (TestObject)in.readObject();//从IO流中读取出来.可以得到一个对象了 System.out.println(w3.getName()); System.out.println(w3.getPassword()); System.out.println(w3.getDate()); } } catch (Exception ex) { ex.printStackTrace(); System.exit(1); } } }
class TestObject implements Serializable { private static final long serialVersionUID = 4558876142427402513L; /** * @param args */ private String name; private String password; private Date date; private List<City> cityList; public List<City> getCityList() { return cityList; } public void setCityList(List<City> cityList) { this.cityList = cityList; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } } class City implements Serializable{ private static final long serialVersionUID = 4558876127402513L; private String name; private String code; public String getCode() { return code; } public void setCode(String code) { this.code = code; } public String getName() { return name; } public void setName(String name) { this.name = name; } } |
|