java notserializableexception,java.io.NotSerializableException

Java序列化的实现很简单,需要序列化的类实现Serializable接口;

然后就可以使用ObjectOutStream的write()方法输出;

反序列化:使用 ObjectInputStream的read()方法即可输入;

序列化和反序列化实现很简单,但是要注意实现Serializable接口的类中不能有其他类的实例化对象;

即:如果这个类中还包含别的类的实例,那么被调用的类也需要实现Serializable接口。

下面就是一个我在学序列化时,遇到的麻烦:

嫌麻烦,在Serializable接口的类中实例化了Scanner类的对象,导致运行错误;

作业需求:

应用对象序列化和对象反序列化向文件写入对象,并将对象读取出来输入到控制台上。

效果图:

aced27df3a9cada726d6fdc14e7a3e4c.png

任务要求:

1、创建Product类,并声明它的属性:ID,name,categories,price

2、继承Serializable接口;

3、定义Product类构造方法;

4、在Test类里面,创建Product类的对象:iphone,ipad,macbook,iwatch

5、实例化对象输入流和对象输出流;

6、写入Product类的四个对象;

7、从文件里读取四个product类的四个对象。

我的代码:

1 importjava.io.Serializable;2 importjava.util.Scanner;3

4 public class Apple implementsSerializable {5 privateString id;6 privateString name;7 privateString categories;8 private doubleprice;9 Scanner sc = new Scanner(System.in);10 public Apple(String id, String name, String categories, doubleprice) {11 this.setId(id);12 this.setName(name);13 this.setCategories(categories);14 this.setPrice(price);15 }16 publicString getId() {17 returnid;18 }19 public voidsetId(String id) {20 this.id =id;21 }22 publicString getName() {23 returnname;24 }25 public voidsetName(String name) {26 this.name =name;27 }28 publicString getCategories() {29 returncategories;30 }31 public voidsetCategories(String categories) {32 this.categories =categories;33 }34 public doublegetPrice() {35 returnprice;36 }37 public void setPrice(doubleprice) {38 this.price =price;39 }40 @Override41 publicString toString() {42 return "产品ID:" + id + "\n产品名称:" + name + "\n产品属性:" + categories + "\n产品价格:" + price+"\n";43 }44

45 }

packagecom.task8;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.ObjectInputStream;importjava.io.ObjectOutputStream;importjava.io.OutputStream;importjava.io.OutputStreamWriter;public classFileTest4 {public static voidmain(String[] args) {try{

FileOutputStream fos= new FileOutputStream("apple.txt");

FileInputStream fis= new FileInputStream("apple.txt");

ObjectOutputStream obs= newObjectOutputStream(fos);

ObjectInputStream ois= newObjectInputStream(fis);

obs.writeObject(new Apple("123","iphone","telephone",4888.0));

obs.writeObject(new Apple("234","ipad","computer",5088.0));

obs.writeObject(new Apple("345","macbook","computer",10688.0));

obs.writeObject(new Apple("256","iwatch","watch",4799.0));

System.out.println("apple系列产品信息:");for(int i = 0;i<4;i++) {try{

System.out.println(ois.readObject());

}catch(ClassNotFoundException e) {//TODO Auto-generated catch block

e.printStackTrace();

}

}

fos.close();

fis.close();

obs.close();

ois.close();

}catch(FileNotFoundException e) {//TODO Auto-generated catch block

e.printStackTrace();

}catch(IOException e) {//TODO Auto-generated catch block

e.printStackTrace();

}

}

}

运行结果:

20180707212645750725.png

重要的事说三遍:

实现Serializable接口的类中不能有其他类的实例化对象;

实现Serializable接口的类中不能有其他类的实例化对象;

实现Serializable接口的类中不能有其他类的实例化对象;

即:如果这个类中还包含别的类的实例,那么被调用的类也需要实现Serializable接口。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值