java中序列化的简单认识
一.什么是序列化
Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比JVM的生命周期更长。但在现实应用中,就可能要求在JVM停止运行之后能够保存(持久化)指定的对象,并在将来重新读取被保存的对象。Java对象序列化就能够帮助我们实现该功能。
使用Java对象序列化,在保存对象时,会把其状态保存为一组字节,在未来,再将这些字节组装成对象。必须注意地是,对象序列化保存的是对象的"状态",即它的成员变量。由此可知,对象序列化不会关注类中的静态变量。
二.简单实现对象序列化
1.创建对象类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | 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.在测试类中实现将对象保存在某个文件中
1 2 3 4 5 6 7 8 9 10 | 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
1 2 3 4 | 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可序列化接口
1 | public class Book implements Serializable |
将Book类继承Serializable接口
运行结果成功,发现C盘存在book.txt文件
因为:所谓的Serializable,就是java提供的通用数据保存和读取的接口。至于从什么地方读出来和保存到哪里去都被隐藏在函数参数的背后了。这样子,任何类型只要实现了Serializable接口,就可以被保存到文件中,或者作为数据流通过网络发送到别的地方。也可以用管道来传输到系统的其他程序中。这样子极大的简化了类的设计。只要设计一个保存一个读取功能就能解决上面说得所有问题。
在继承Serializable接口的前提下在mian()中设计保存读写功能
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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]
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET 9 new features-C#13新的锁类型和语义
· Linux系统下SQL Server数据库镜像配置全流程详解
· 现代计算机视觉入门之:什么是视频
· 你所不知道的 C/C++ 宏知识
· 聊一聊 操作系统蓝屏 c0000102 的故障分析
· 不到万不得已,千万不要去外包
· C# WebAPI 插件热插拔(持续更新中)
· 会议真的有必要吗?我们产品开发9年了,但从来没开过会
· 如何打造一个高并发系统?
· 《SpringBoot》EasyExcel实现百万数据的导入导出