Java学习之——Java Serializable

简介:

1.什么是Serializable接口?

http://en.wikipedia.org/wiki/Serialization
Java 提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字节序列,该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。

将序列化对象写入文件之后,可以从文件中读取出来,并且对它进行反序列化,也就是说,对象的类型信息、对象的数据,还有对象中的数据类型可以用来在内存中新建对象。

整个过程都是Java虚拟机(JVM)独立的,也就是说,在一个平台上序列化的对象可以在另一个完全不同的平台上反序列化该对象。 
类的可序列化通过类实现 java.io.Serializable接口来实现。没有实现这个接口的类将没有序列化或反序列化这两个状态。一个序列化类的子类(subtype)它们自己也是序列化的
。序列化接口没有方法或值,实现它仅仅是为了表示序列化的含义。

2.为什么要有序列化?

StackOverFlow上,有相关问题:
http://stackoverflow.com/questions/2232759/what-is-the-purpose-of-serialization-in-java

http://stackoverflow.com/questions/441196/why-java-needs-serializable-interface
复制代码
1.在程序运行过程中,所有的对象都是在内存中。当运行结束时,对象所占的内存被操作系统回收。程序就像是忘记了它运行时发生的所有事一样。序列化正好解决了这个问题,
通过保存对象到磁盘上,因此它可以在下次开始时重新读取。 Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比JVM的生命周期更长。
但在现实应用中,就可能要求在JVM停止运行之后能够保存(持久化)指定的对象,并在将来重新读取被保存的对象。Java对象序列化就能够帮助我们实现该功能。
2.方便传输和持久化:序列化是将对象转化成能被存储的格式(例如文件或内存缓存或在网络连接中传输)。这种机制允许你将对象通过网络进行传播,并可以随时把对象持久化
到数据库、文件等系统里。
复制代码

3.既然Serializable中没有方法,为什么不将所有类都默认序列化?

复制代码
为什么不将所有类默认序列化,而必须通过实现Serializable接口来实现Java的序列化机制。
主要有三点原因:
1.不是所有的对象都能在序列化状态中找到有用的语义。例如,一个Thread对象和当前的JVM的状态有关。反序列化的Thread对象没有了保持有用的语义的上下文环境了(Context)
2.对象的序列化状态形成了类相容性的合约。保证不同版本的序列化类的兼容性需要额外的工作和考虑。因此,将一个类变成可序列化类需要深思熟虑的设计的决定,
而不是默认的情况。
3.序列化允许访问非短暂的、私有的类的成员,原本是不能被访问的,包含敏感信息(如密码password)的类不应该被序列化 或 externalizable。
复制代码
复制代码
import java.io.Serializable;

/**
 * 实现Serializable接口的类Person
 * @author lenovo
 *
 */
public class Person implements Serializable{
    private String name;
    private int age;
    private transient int no;//临时的,该属性不会被序列化
    
    public int getNo() {
        return no;
    }
    public void setNo(int no) {
        this.no = no;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Name:"+this.name+"\nAge:"+this.age+"\nSSN:"+this.no;
    }
}
复制代码
复制代码
 1 import java.io.FileInputStream;
 2 import java.io.FileNotFoundException;
 3 import java.io.FileOutputStream;
 4 import java.io.IOException;
 5 import java.io.ObjectInputStream;
 6 import java.io.ObjectOutputStream;
 7 
 8 
 9 public class Test {
10    public static void main(String[] args) {
11     Person p1 = new Person();
12     p1.setAge(20);
13     p1.setName("John");
14     p1.setNo(123456);
15     
16     try {
17         FileOutputStream fileOutputStream = new FileOutputStream("C:\\Users\\lenovo\\desktop\\PersonDemo.txt");
18         ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
19         System.out.println("1.序列化:"+p1.getName());
20         System.out.println(p1.toString());
21         objectOutputStream.writeObject(p1);
22         objectOutputStream.close();
23     }catch (FileNotFoundException e) {
24         e.printStackTrace();
25     }catch (IOException e) {
26         // TODO Auto-generated catch block
27         e.printStackTrace();
28     }
29     
30     try{
31          FileInputStream fileInputStream = new FileInputStream("C:\\Users\\lenovo\\desktop\\personDemo.txt");
32         ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
33         Person p2 = (Person)objectInputStream.readObject();
34         System.out.println("2.反序列化:"+p2.getName());
35         System.out.println(p2.toString());
36         objectInputStream.close();
37     }catch(Exception e){
38         e.printStackTrace();
39     }
40     
41 }
42 }
复制代码

运行结果:

序列化文件(以16进制保存):

原文地址:http://www.cnblogs.com/JohnTsai/p/4217215.html
相关文章
|
2天前
|
Java 数据库连接 数据库
【潜意识Java】深度分析黑马项目《苍穹外卖》在Java学习中的重要性
《苍穹外卖》项目对Java学习至关重要。它涵盖了用户管理、商品查询、订单处理等模块,涉及Spring Boot、MyBatis、Redis等技术栈。
23 4
|
2天前
|
前端开发 Java 数据库连接
【潜意识Java】深度解读JavaWeb开发在Java学习中的重要性
深度解读JavaWeb开发在Java学习中的重要性
20 4
|
2天前
|
存储 移动开发 算法
【潜意识Java】Java基础教程:从零开始的学习之旅
本文介绍了 Java 编程语言的基础知识,涵盖从简介、程序结构到面向对象编程的核心概念。首先,Java 是一种高级、跨平台的面向对象语言,支持“一次编写,到处运行”。接着,文章详细讲解了 Java 程序的基本结构,包括包声明、导入语句、类声明和 main 方法。随后,深入探讨了基础语法,如数据类型、变量、控制结构、方法和数组。此外,还介绍了面向对象编程的关键概念,例如类与对象、继承和多态。最后,针对常见的编程错误提供了调试技巧,并总结了学习 Java 的重要性和方法。适合初学者逐步掌握 Java 编程。
11 1
|
3月前
|
XML Java 编译器
Java学习十六—掌握注解:让编程更简单
Java 注解(Annotation)是一种特殊的语法结构,可以在代码中嵌入元数据。它们不直接影响代码的运行,但可以通过工具和框架提供额外的信息,帮助在编译、部署或运行时进行处理。
114 43
Java学习十六—掌握注解:让编程更简单
|
3月前
|
存储 SQL 小程序
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
这篇文章详细介绍了Java虚拟机(JVM)的运行时数据区域和JVM指令集,包括程序计数器、虚拟机栈、本地方法栈、直接内存、方法区和堆,以及栈帧的组成部分和执行流程。
53 2
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
|
2月前
|
Java 大数据 API
14天Java基础学习——第1天:Java入门和环境搭建
本文介绍了Java的基础知识,包括Java的简介、历史和应用领域。详细讲解了如何安装JDK并配置环境变量,以及如何使用IntelliJ IDEA创建和运行Java项目。通过示例代码“HelloWorld.java”,展示了从编写到运行的全过程。适合初学者快速入门Java编程。
|
2月前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
3月前
|
小程序 Oracle Java
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
这篇文章是关于JVM基础知识的介绍,包括JVM的跨平台和跨语言特性、Class文件格式的详细解析,以及如何使用javap和jclasslib工具来分析Class文件。
68 0
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
|
3月前
|
前端开发 Java 应用服务中间件
Javaweb学习
【10月更文挑战第1天】Javaweb学习
44 2
|
3月前
|
存储 安全 Java
【用Java学习数据结构系列】探索顺序表和链表的无尽秘密(附带练习唔)pro
【用Java学习数据结构系列】探索顺序表和链表的无尽秘密(附带练习唔)pro
34 3