java.io.NotSerializableException

Posted HJ0101

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java.io.NotSerializableException相关的知识,希望对你有一定的参考价值。

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

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

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

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

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

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

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

  作业需求:

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

效果图: 

//img.mukewang.com/climg/5af016d50001dc4902330565.jpg

任务要求:

1、创建Product类,并声明它的属性:ID,name,categories,price
2、继承Serializable接口;
3、定义Product类构造方法;
4、在Test类里面,创建Product类的对象:iphone,ipad,macbook,iwatch
5、实例化对象输入流和对象输出流;
6、写入Product类的四个对象;
7、从文件里读取四个product类的四个对象。

 

我的代码:

 1 import java.io.Serializable;
 2 import java.util.Scanner;
 3 
 4 public class Apple implements Serializable {
 5     private String id;
 6     private String name;
 7     private String categories;
 8     private double price;
 9     Scanner sc = new Scanner(System.in);
10     public Apple(String id, String name, String categories, double price) {
11         this.setId(id);
12         this.setName(name);
13         this.setCategories(categories);
14         this.setPrice(price);
15     }
16     public String getId() {
17         return id;
18     }
19     public void setId(String id) {
20         this.id = id;
21     }
22     public String getName() {
23         return name;
24     }
25     public void setName(String name) {
26         this.name = name;
27     }
28     public String getCategories() {
29         return categories;
30     }
31     public void setCategories(String categories) {
32         this.categories = categories;
33     }
34     public double getPrice() {
35         return price;
36     }
37     public void setPrice(double price) {
38         this.price = price;
39     }
40     @Override
41     public String toString() {
42         return "产品ID:" + id + "\\n产品名称:" + name + "\\n产品属性:" + categories + "\\n产品价格:" + price+"\\n";
43     }
44     
45 }

 

package com.task8;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;

public class FileTest4 {
    public static void main(String[] args) {
        try {
            FileOutputStream fos = new FileOutputStream("apple.txt");
            FileInputStream fis = new FileInputStream("apple.txt");
            ObjectOutputStream obs = new ObjectOutputStream(fos);
            ObjectInputStream ois = new ObjectInputStream(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();
        }
    }
}

运行结果:

 

 重要的事说三遍:

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

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

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

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

以上是关于java.io.NotSerializableException的主要内容,如果未能解决你的问题,请参考以下文章