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]

posted @   Goxcheer  阅读(162)  评论(0编辑  收藏  举报
编辑推荐:
· .NET 9 new features-C#13新的锁类型和语义
· Linux系统下SQL Server数据库镜像配置全流程详解
· 现代计算机视觉入门之:什么是视频
· 你所不知道的 C/C++ 宏知识
· 聊一聊 操作系统蓝屏 c0000102 的故障分析
阅读排行:
· 不到万不得已,千万不要去外包
· C# WebAPI 插件热插拔(持续更新中)
· 会议真的有必要吗?我们产品开发9年了,但从来没开过会
· 如何打造一个高并发系统?
· 《SpringBoot》EasyExcel实现百万数据的导入导出
点击右上角即可分享
微信分享提示