一.什么是序列化
Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比JVM的生命周期更长。但在现实应用中,就可能要求在JVM停止运行之后能够保存(持久化)指定的对象,并在将来重新读取被保存的对象。Java对象序列化就能够帮助我们实现该功能。
使用Java对象序列化,在保存对象时,会把其状态保存为一组字节,在未来,再将这些字节组装成对象。必须注意地是,对象序列化保存的是对象的"状态",即它的成员变量。由此可知,对象序列化不会关注类中的静态变量。
二.简单实现对象序列化
1.创建对象类
public class Book { private String name; private String author; private int price; public Book(String name, String author, int price) { super(); this.name = name; this.author = author; this.price = price; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } @Override public String toString() { return "Book [name=" + name + ", author=" + author + ", price=" + price + "]"; } }
2.在测试类中实现将对象保存在某个文件中
public class TestSerialization { public static void main(String[] args) throws Exception{ Book book=new Book("java编程思想","张三",50); File file=new File("C:/book.out"); ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream(file)); out.writeObject(book); out.close(); } }
3.运行程序发现报错NotSerializableException
Exception in thread "main" java.io.NotSerializableException: com.qgx.test.Book at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348) at com.qgx.test.TestSerialization.main(TestSerialization.java:14)
这是因为程序还不支持对象可序列化
4.引入Serializable可序列化接口
public class Book implements Serializable
将Book类继承Serializable接口
运行结果成功,发现C盘存在book.txt文件
因为:所谓的Serializable,就是java提供的通用数据保存和读取的接口。至于从什么地方读出来和保存到哪里去都被隐藏在函数参数的背后了。这样子,任何类型只要实现了Serializable接口,就可以被保存到文件中,或者作为数据流通过网络发送到别的地方。也可以用管道来传输到系统的其他程序中。这样子极大的简化了类的设计。只要设计一个保存一个读取功能就能解决上面说得所有问题。
在继承Serializable接口的前提下在mian()中设计保存读写功能
public class TestSerialization { public static void main(String[] args) throws Exception{ Book book=new Book("java编程思想","张三",50); File file=new File("C:/book.txt"); ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream(file)); out.writeObject(book); out.close(); ObjectInputStream in=new ObjectInputStream(new FileInputStream(file)); Book newBook=(Book)in.readObject(); System.out.println(newBook); } }
这段实现了先将Book对象序列化,存入book.txt
然后将book.txt存储的数据反序列化到newBook对象并输出
输出结果:Book [name=java编程思想, author=张三, price=50]