java中序列化的简单认识
一.什么是序列化
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]
最新文章
- js截取中英文字符串、标点符号无乱码示例解读
- IOS managerTime
- C#-黑客-数据库访问-字符串的攻击和防御
- 【C#】 一些不常用,很容易混淆的知识点
- XML节点名称中有小数点处理(deal with dot)导致使用xpath时报错解决方法
- canvas-star6.html
- java 异常java.lang.UnsupportedOperationException
- JavaScript中七种函数调用方式及对应 this 的含义
- LeeCode-Insertion Sort List
- cocos2d-x V3.0 呼叫加速度计 Acceleration
- USB总线标准
- 自己实现一个nullptr
- 【.NET Core项目实战-统一认证平台】第十三章 授权篇-如何强制有效令牌过期
- HTML5标签选择,图文混排使用dl dt dd
- 如何让classmethod只允许使用用类对象来调用
- 面向对象课程 - 寒假第三次作业 - C++计算器项目初始部分
- UpdateBatch到底是怎么用的?
- hdu 3951 硬币围成一圈(博弈)
- Java web项目中新建maven项目出现的问题
- python应用:爬虫框架Scrapy系统学习第二篇——windows下安装scrapy