Java序列化的实现很简单,需要序列化的类实现Serializable接口;
然后就可以使用ObjectOutStream的write()方法输出;
反序列化:使用 ObjectInputStream的read()方法即可输入;
序列化和反序列化实现很简单,但是要注意实现Serializable接口的类中不能有其他类的实例化对象;
即:如果这个类中还包含别的类的实例,那么被调用的类也需要实现Serializable接口。
下面就是一个我在学序列化时,遇到的麻烦:
嫌麻烦,在Serializable接口的类中实例化了Scanner类的对象,导致运行错误;
作业需求:
应用对象序列化和对象反序列化向文件写入对象,并将对象读取出来输入到控制台上。
效果图:
任务要求:
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();
}
}
}
运行结果:
重要的事说三遍:
实现Serializable接口的类中不能有其他类的实例化对象;
实现Serializable接口的类中不能有其他类的实例化对象;
实现Serializable接口的类中不能有其他类的实例化对象;
即:如果这个类中还包含别的类的实例,那么被调用的类也需要实现Serializable接口。