关于对象序列化和反序列化的问题

a292320587 2016-09-07 11:36:02
==============================================================测试类
public class SerialTest{
private static Connection conn=null;
private static PreparedStatement ps=null;
private static ResultSet rs=null;

public void serialize(){
User user=new User("1000","zhuchaofan","123");
conn=jdbcUtil.getConnection();
String sql="insert into user_info values(?)";
try {
ps=conn.prepareStatement(sql);
// ps.setObject(1, user);

ps.setBytes(1,SerializeUtil.serializeObject(user));
ps.execute();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
jdbcUtil.CloseAll(ps, rs, conn);
}
}

public void deserialize(){
conn=jdbcUtil.getConnection();
String sql="select * from user_info";
User user=new User();
try {
ps=conn.prepareStatement(sql);
rs=ps.executeQuery();
while(rs.next()){
byte[] bytes=rs.getBytes("data");
user=(User)SerializeUtil.deserializeObject(bytes);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
jdbcUtil.CloseAll(ps, rs, conn);
}

}




public static void main(String[] args) {
SerialTest rt=new SerialTest();
// rt.serialize();
rt.deserialize();
}

}

===================================================================序列化和反序列化
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;


public final class SerializeUtil {

/** 序列化对象
* @throws IOException */
public static byte[] serializeObject(Object object) throws IOException{
ByteArrayOutputStream saos=new ByteArrayOutputStream();
ObjectOutputStream oos=new ObjectOutputStream(saos);
oos.writeObject(object);
oos.flush();
return saos.toByteArray();
}

/** 反序列化对象
* @throws IOException
* @throws ClassNotFoundException */
public static Object deserializeObject(byte[]buf) throws IOException, ClassNotFoundException{
Object object=null;

ByteArrayInputStream sais=new ByteArrayInputStream(buf);
ObjectInputStream ois = new ObjectInputStream(sais);
object=ois.readObject();
return object;
}
}


=======================================错误==================================
java.io.StreamCorruptedException: invalid stream header: 41434544
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:804)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:299)
at com.guigu.test.SerializeUtil.deserializeObject(SerializeUtil.java:29)
at com.guigu.test.SerialTest.deserialize(SerialTest.java:46)
at com.guigu.test.SerialTest.main(SerialTest.java:69)


问:
反序列化的ObjectInputStream ois = new ObjectInputStream(sais);这里出了问题,
错误显示时invalid stream header:41434544
我参考了一些网上的例子,感觉没有什么差别,不知道为什么程序到我这里就会报这个错误。
我猜测是因为
byte[] bytes=rs.getBytes("data");
user=(User)SerializeUtil.deserializeObject(bytes);
这里传递的参数是纯粹的数组。是否需要放到流对象里面再拿出来
...全文
147 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
反序列化的值是你序列化的值吗?应该不是的吧。
a292320587 2016-09-07
  • 打赏
  • 举报
回复
我看了好一些例子,用法大相径庭,不知道自己的错误出在哪里了。
  • 打赏
  • 举报
回复
你数据库的编码和java程序读取字符串的编码不一样,如果相同的话,可以存成varchar类型的,我试过了,可以正常执行
a292320587 2016-09-07
  • 打赏
  • 举报
回复
我知道错哪里了 我把表格类型改成 create table user_info( data blob ) 这样就可以了。解决了一天的问题。真的心痛。
a292320587 2016-09-07
  • 打赏
  • 举报
回复
引用 2 楼 fangmingshijie 的回复:
反序列化的值是你序列化的值吗?应该不是的吧。
我想实现的情况是把user对象存到表中,因为表中只有这么一条数据 所以我就直接用select * from user_info这句话来获取结果了。
a292320587 2016-09-07
  • 打赏
  • 举报
回复
引用 3 楼 yuanxiao27 的回复:
user_info 你表的结构呢?难道你存入的就是 一个 user 序列话后的二进制?如果不是的话。肯定会报错
我的表的结构是 create table user_info( data varchar(250) )
疯狂的驴子 2016-09-07
  • 打赏
  • 举报
回复
user_info 你表的结构呢?难道你存入的就是 一个 user 序列话后的二进制?如果不是的话。肯定会报错

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧