关于序列化的问题Serializable

jhbaiyang 2010-04-06 06:40:58
要实现一个文件存储的功能,要把很多类的实例存储起来。
比如创建数据源,我可能创建N多个数据源,就是做这个数据源的配置信息的保存。
比如创建了类Data,并实现了Serializable接口,又创建了类DataContainer,并实现了Serializable接口;

public class Data implements Serializable{

public String user = "";
public String pass = "";
....
get/set方法...
}

public class CommonPlanContainer implements Serializable{

private Vector<Data> data;

public Vector<Data> getData() {
return data;
}

public void setData(Vector<Data> data) {
this.data = data;
}
}


但把这个DataContainer保存进文件的时候,总提示我需要序列化
java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: com.data.Data
...全文
184 14 打赏 收藏 转发到动态 举报
写回复
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
jhbaiyang 2010-04-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 sharke118 的回复:]

你只是实现了 这个接口 但是serializable 这个接口里面是没有方法的 是个空接口 你要序列化还得 通过对象流来处理 inputstream outputstream 这些流你比较熟悉吧 这个对象流也是类似的处理方式 就是
ObjectOutputStream 和 ObjectInputStream 这两个流 用writeObject 和 readObject 来写入写出对象流

……
[/Quote]

根据这位哥们的方法,我做出来了。
问题出在serialVersionUID上,需要给每个需要序列化的类定义serialVersionUID,哥们认为这个serialVersionUID就是个标示符一样的东西,用来反序列化的时候,还能找回来,但在定义的时候发现,并不是随便定义的,因为serialVersionUID是long型的,所以Data和CommonPlanContainer分别定义了5L和6L,定义成其他的(例如3L,4L等)就会出错。其中1L和2L被占其他需要序列化的类占用了。
poFate 2010-04-07
  • 打赏
  • 举报
回复
LZ vector能够序列化吗?
像8楼那么做是可以的
pgwcumt 2010-04-07
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 goldenfish1919 的回复:]

Java code

//给你修改了一下
import java.util.*;
import java.io.*;

class Data implements Serializable{
public String user = "";
public String pass = "";
public String getUser() {
return……
[/Quote]

若鱼1919 2010-04-07
  • 打赏
  • 举报
回复

//给你修改了一下
import java.util.*;
import java.io.*;

class Data implements Serializable{
public String user = "";
public String pass = "";
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
public String toString(){
return new StringBuilder("[").append(user).append(",").append(pass).append("]").toString();
}
}

public class CommonPlanContainer implements Serializable{

private Vector<Data> datas;
private int size;//增加一个size属性,存放的是data里面的元素的个数

public Vector<Data> getData() {
return datas;
}
public void setData(Vector<Data> data) {
this.datas = data;
this.size=data.size();//给size赋初始值
}
public String toString(){
StringBuilder sb=new StringBuilder("{");
for(Data d : datas){
sb.append(d.toString());
sb.append(" ");
}
sb.append("}");
return sb.toString();
}
private void writeObject(java.io.ObjectOutputStream out) throws IOException {
System.out.println("writeObject invoked");
out.writeObject(size);//先把元素个数序列化
for(Data d : datas){ //然后,把每一个Data对象序列化
out.writeObject(d);
}
}
private void readObject(java.io.ObjectInputStream in) throws IOException,
ClassNotFoundException {
System.out.println("readObject invoked");
datas =new Vector<Data>();
int count= ((Integer)in.readObject()).intValue();//先读出元素的个数来
for(int i=0;i<count;i++){//再读取每一个元素,重新构造Vector
Data d= (Data)in.readObject();
datas.add(d);
}
size=count;
}
public static void main(String args[])throws Exception{
Vector<Data> datas =new Vector<Data>();
Data d=new Data();
d.setPass("pass");
d.setUser("user");
datas.add(d);
CommonPlanContainer container = new CommonPlanContainer();
container.setData(datas);

ByteArrayOutputStream baos= new ByteArrayOutputStream();
ObjectOutputStream oos=new ObjectOutputStream(baos);
oos.writeObject(container);
byte[] buff=baos.toByteArray();
ByteArrayInputStream bain=new ByteArrayInputStream(buff);
ObjectInputStream oin=new ObjectInputStream(bain);
CommonPlanContainer con=(CommonPlanContainer)oin.readObject();
System.out.println(con);
oin.close();
oos.close();
}
}
believefym 2010-04-07
  • 打赏
  • 举报
回复
确认Data类是最新编译的?
sharke118 2010-04-07
  • 打赏
  • 举报
回复
http://java.sun.com/j2se/1.4.2/docs/api/java/io/Serializable.html

这个是serializable 接口的详细介绍
sharke118 2010-04-07
  • 打赏
  • 举报
回复
你只是实现了 这个接口 但是serializable 这个接口里面是没有方法的 是个空接口 你要序列化还得 通过对象流来处理 inputstream outputstream 这些流你比较熟悉吧 这个对象流也是类似的处理方式 就是
ObjectOutputStream 和 ObjectInputStream 这两个流 用writeObject 和 readObject 来写入写出对象流

详细你可以参考:http://xiebh.javaeye.com/blog/121311
hjjk123 2010-04-07
  • 打赏
  • 举报
回复
DataContainer??
没这个类啊???
jhbaiyang 2010-04-07
  • 打赏
  • 举报
回复
我就是想问 为什么我已经实现了序列化 还会报未序列化的错误?
hckxzy 2010-04-07
  • 打赏
  • 举报
回复
FrogKing_7 2010-04-07
  • 打赏
  • 举报
回复
JAVA序列化详解(串行化)http://www.phome.asia/forum/thread/23624.html
py330316117 2010-04-06
  • 打赏
  • 举报
回复
首先你得了解序列化是干什么用的,序列化就是为了跨平台传输字节码的,也就是说你可以再xp系统上用序列化传输字节在linux系统上解码让后还能够使用,所以序列化一般在网路编程中用来在客户端和服务器端传输字节,其他地方如果是类似功能的也可以用,但还是再java网路编程中以用较多。
像你这个例子是可以用序列化的
duyu1025 2010-04-06
  • 打赏
  • 举报
回复
参考这个例子:



public class FooImpl implements java.io.Serializable{
private String message;

public String getFoo() {
return message;
}

public void setMessage(String message) {
this.message = message;
}

private void writeObject(java.io.ObjectOutputStream out) throws IOException {
System.out.println("writeObject invoked");
out.writeObject(this.message == null ? "hohohahaha" : this.message);
}

private void readObject(java.io.ObjectInputStream in) throws IOException,
ClassNotFoundException {
System.out.println("readObject invoked");
this.message = (String) in.readObject();
System.out.println("got message:" + message);
}

private Object writeReplace() throws ObjectStreamException {
System.out.println("writeReplace invoked");
return this;
}

private Object readResolve() throws ObjectStreamException {
System.out.println("readResolve invoked");
return this;
}

public Object serialize() throws IOException, ClassNotFoundException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(this);
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
return ois.readObject();
}
public static void main(String[] args) throws IOException,
ClassNotFoundException {
FooImpl fooimpl = new FooImpl();
fooimpl.serialize();




相关推荐

62,569

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告