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进制保存):

时间: 2024-10-10 08:53:17

Java学习之——Java Serializable的相关文章

JAVA学习篇--Java类加载

由来: 与普通程序不同的是,Java程序(class文件)并不是本地的可执行程序(解释性语言).当运行Java程序时,首先运行JVM(Java虚拟机),然后再把Javaclass加载到JVM里头运行,负责加载Javaclass的这部分就ClassLoader.中文叫做类加载器. 类加载器就好比一个代理,你需要什么,我通过类加载器将你需要的内容返回给你! 类加载器有什么作用? 当程序需要的某个类,那么需要通过类加载器把类的二进制加载到内存中. 解释: 类加载器也是Java类,因为其他是java类的

JAVA学习篇--JAVA的两种编程模式对比

在Drp项目中,讲解了两种编程模式Model 1和Model2,下面是对这两种模式的简单理解,以及由于Model2是基于MVC架构的模式,就将我们易混淆的MVC与我们之前学的三层架构进行对比学习一下. Model1 所谓Model1就是JSP大行其道的时代,在Model1模式下,整个Web应用几乎全部由JSP页面组成,JSP页面接收处理客户端请求,对请求处理后直接做出响应.用少量的JavaBean来处理数据库连接.数据库访问等操作. 代码示例:修改用户信息 主页面的js跳转: function

[ Java学习基础 ] Java构造函数

构造方法是类中特殊方法,用来初始化类的实例变量,它在创建对象(new运算符)之后自动调用. Java构造方法的特点如下: 构造方法名必须与类名相同. 构造方法没有任何返回值,包括void. 构造方法只能与new运算符结合使用. 示例代码如下: 1 //Rectangle.java文件 2 package com.a51work6; 3 4 // 矩形类 5 public class Rectangle { 6 7 // 矩形宽度 8 int width; 9 // 矩形高度 10 int hei

好程序员Java学习路线Java bean是个什么概念

好程序员Java学习路线Java bean是个什么概念,Bean的中文含义是"豆子",顾名思义JavaBean是一段Java小程序.JavaBean实际上是指一种特殊的Java类,它通常用来实现一些比较常用的简单功能,并可以很容易的被重用或者是插入其他应用程序中去.所有遵循一定编程原则的Java类都可以被称作JavaBean.一. Java Bean技术概述??????? Java Bean是基于Java的组件模型,由属性.方法和事件3部分组成.在该模型中,JavaBean可以被修改或

Java学习随笔 - Java保留字

零.说在前面 之前主要是学C/CPP,由于某些原因,打算从头开始把Java的基础从头过一遍,巩固一下.于是,从今天开始开坑Java学习随笔,会将自己在复习Java过程中的一些心得体会啥的写上来,帮助自己整理知识. 一.synchronized synchronized关键字之前都没见过,于是Google了一下.它的作用是给对象.方法.代码块加锁,使得同时只能有一个线程执行.使用.相当于是互斥的一种关系. 二.transient 一个类在实现了Serializable接口之后,其中有部分数据不想进

最全Java学习路线图——Java学习指南

准备篇 适用/适合人群:适合基础小白 目标:掌握JavaSE. ●技术点小节: 1.开发工具的安装配置的介绍 2.JDK安装 3.DOS环境编程 4.Eclipse的安装使用 ●JAVA基础 1.基本的语法规范 2.数据类型 3.流程控制 4.函数 ●初识JavaOOP 1.类,对象,面向编程思想 2.字符串类 3.随机数 4.正则表达式 5.递归的使用 ●JavaOOP基础 1.JavaOOP之封装 2.JavaOOP之继承 3.JavaOOP之多态 4.Java访问修饰符 5.Java接口

<JAVA学习一>JAVA简介

 摘要: 本篇博客仅作为笔记,如有侵权,请联系,立即删除(网上找博客学习,然后手记笔记,因纸质笔记不便保存,所以保存到网络笔记). 一.什么是JAVA语言 OAK--JAVA语法规则与C++类似. 有更高的可靠性,较高的安全性. 编译型+解释型. 二.JAVA的应用领域 开发工具Eclipse.NetBeans.JBuilder等. 三.JAVA的版本 1.JAVA SE(基础版本) JAVA SE是JAVA的标准版,主要用于桌面应用程序的开发. 2.JAVA EE JAVA EE是JAVA的企

Java学习笔记----Java基础11 对象引用

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 我们之前一直在使用“对象”这个概念,但没有探讨对象在内存中的具体存储方式.这方面的讨论将引出“对象引用”(object reference)这一重要概念. 对象引用 我们沿用之前定义的Human类,并有一个Test类: public class Test { public static void main(String[] args) { Human aPerson = new

[Java学习笔记] Java核心技术 卷1 第四章

第4章 对象与类 4.1 类和对象的基本概念 描述了类和对象的基本概念,以及类之间的关系介绍. 程序中的很多对象来自于标准库,还有一些自定义的. 结构化程序设计:通过设计一系列的过程(算法),选择合适的存储方式来解决问题. 算法+数据结构 4.1.1 类/封装/继承 类是构造对象的模板,由类构造对象的过程称为创建类的实例. 封装:也称为数据隐藏.从形式上看,封装不过是将数据和行为组合在一个包中,并对对象的使用者隐藏了数据的实现方式.优点4.2.3 实例域:对象中的数据. 方法:操纵数据的过程.

Java学习资料-Java异常处理

4.Java异常处理 4.1 Java异常概念 Java异常是Java提供的用于处理程序中错误的一种机制. 所谓错误是指在程序运行的过程中发生一些异常事件(如:除0溢出,数组下标越界,所要读取的文件不存在). 设计良好的程序应该在异常发生时提供处理这些错位的方法,使得程序不会因为异常的发生而阻断或产生不可预见的结果. Java程序的执行过程中如出现异常事件,可以生成一个异常类,该异常类封装了异常事件的信息并将被提交给Java运行时的系统,这个过程称为抛出(throw)异常. 当Java运行时系统