码迷,mamicode.com
首页 > 其他好文 > 详细

序列化和反序列化

时间:2015-01-27 13:16:28      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:

数据库:

CREATE TABLE T_EXTERIOR  (
    "ID" INTEGER NOT NULL , 
     "EXTERIOR" BLOB(1048576) LOGGED NOT COMPACT NOT NULL )   

序列化并保存到数据库(A项目):

        Exterior exterior = new Exterior();
        
        ObjectOutputStream oos;
        try {
            //生成序列化好后的文件
            oos = new ObjectOutputStream(new FileOutputStream(new File("aa.tmp")));
            oos.writeObject(exterior);
            oos.flush();
            oos.close();
            
            //读取序列化好后的文件并保存到数据库中
            InputStream is = new FileInputStream(new File("aa.tmp"));
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            int size = 0;
            byte[] buffer = new byte[1024];
            while((size=is.read(buffer))!=-1){
                out.write(buffer, 0, size);
            }
            final byte[] bt = out.toByteArray();
            
            String sql = "insert into T_EXTERIOR(ID,EXTERIOR) VALUES(?,?)";
            jdbcTemplate.update(sql, new PreparedStatementSetter() {
                public void setValues(PreparedStatement ps) throws SQLException {
                    ps.setInt(1, 1);
                    ps.setBytes(2, bt);
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
            result = "false";
        }

被序列化的类:(A项目)

import java.io.Serializable;

public class Exterior implements Serializable{

    private static final long serialVersionUID = 1L;

    public int add(int ys, int csd,int jg,int sf,int yf,int sd){
        return ys+csd+jg+sf+yf+sd;
    }
}

 

读取数据库中序列化好的类并反序列化:(B项目)

String sql = "select EXTERIOR from T_EXTERIOR where id=1";
InputStream ins = null;
try{
    Connection con = jdbcTemplate.getDataSource().getConnection();
    Statement ps = con.createStatement();
    ResultSet rs = ps.executeQuery(sql);
    while(rs.next()){
        Blob blob = rs.getBlob("EXTERIOR");
        ins = blob.getBinaryStream();
    }
    
    ObjectInputStream ois = new ObjectInputStream(ins);
    Object o = ois.readObject();
    Method[] methods = o.getClass().getMethods();
    for(Method method : methods){
        if(method.getName().equals("add")){
            Class[] css = method.getParameterTypes();
            Object[] params = new Object[css.length];
            params[0] = ys;
            params[1] = csd;
            params[2] = jg;
            params[3] = sf;
            params[4] = yf;
            params[5] = sd;
            /**
            int index = 0;
            for(Class cs : css){
                if(String.class == cs){
                    params[index++] = "String val is :" + index;
                }
            }*/
            Object rt = method.invoke(o, params);
            if(rt.getClass() == Integer.class){
                result = String.valueOf((Integer)rt);
            }else if(rt.getClass()==String.class){
                result = (String)rt;
            }
        }
    }
}catch (Exception e) {
    e.printStackTrace();
}

上面的代码会报错:

Object o = ois.readObject();
这行代码会去找classpath下是否有这个类,没有就会报错。

所以B项目必须把上面那个被序列化的类也要拷贝过来,并且即使调用也是调用B项目里这个类的方法,而不是序列化之前的那个类的方法,可以通过add返回不同值得到校验。



 

序列化和反序列化

标签:

原文地址:http://www.cnblogs.com/yangzhilong/p/4252407.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!