`
zhaoshg
  • 浏览: 259635 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java中对象的串行化(Serialization)和transient关键字

    博客分类:
  • java
阅读更多

 

转自http://blog.csdn.net/hbcui1984/archive/2007/04/02/1549290.aspx

一、串行化的概念和目的

1.什么是串行化

对象的寿命通常随着生成该对象的程序的终止而终止。有时候,可能需要将对象的状态保存下来,在需要时再将对象恢复。我们把对象的这种能记录自己的状态以便将来再生的能力,叫作对象的持续性(persistence)。对象通过写出描述自己状态的数值来记录自己 ,这个过程叫对象的串行化(Serialization) 。串行化的主要任务是写出对象实例变量的数值。如果变量是另一对象的引用,则引用的对象也要串行化。这个过程是递归的,串行化可能要涉及一个复杂树结构的单行化,包括原有对象、对象的对象、对象的对象的对象等等。对象所有权的层次结构称为图表(graph)。

2.串行化的目的

Java对象的串行化的目标是为Java的运行环境提供一组特性,如下所示:

1) 尽量保持对象串行化的简单扼要 ,但要提供一种途径使其可根据开发者的要求进行扩展或定制。

2) 串行化机制应严格遵守Java的对象模型 。对象的串行化状态中应该存有所有的关于种类的安全特性的信息。

3) 对象的串行化机制应支持Java的对象持续性。

4) 对象的串行化机制应有足够的 可扩展能力以支持对象的远程方法调用(RMI)。

5) 对象串行化应允许对象定义自身的格式即其自身的数据流表示形式,可外部化接口来完成这项功能。

二、串行化方法

从JDK1.1开始,Java语言提供了对象串行化机制 ,在java.io包中,接口Serialization用来作为实现对象串行化的工具 ,只有实现了Serialization的类的对象才可以被串行化。

Serializable接口中没有任何的方法。当一个类声明要实现Serializable接口时,只是表明该类参加串行化协议,而不需要实现任何特殊的方法。下面我们通过实例介绍如何对对象进行串行化。

1.定义一个可串行化对象

一个类,如果要使其对象可以被串行化,必须实现Serializable接口。我们定义一个类Student如下:

package chb.demo.test;

import java.io.Serializable;

public class Student implements Serializable {
    
int id; // 学号
    String name; // 姓名
    int age; // 年龄
    String department; // 系别

    
public Student(int id, String name, int age, String department) {
        
this.id = id;
        
this.name = name;
        
this.age = age;
        
this.department = department;
    }

}

2.构造对象的输入/输出流

要串行化一个对象,必须与一定的对象输出/输入流联系起来,通过对象输出流将对象状态保存下来,再通过对象输入流将对象状态恢复。

java.io包中,提供了ObjectInputStream和ObjectOutputStream将数据流功能扩展至可读写对象 。在ObjectInputStream 中用readObject()方法可以直接读取一个对象,ObjectOutputStream中用writeObject()方法可以直接将对象保存到输出流中。

package chb.demo.test;

import java.io.IOException;
import java.io.FileOutputStream;
import java.io.FileInputStream;
import java.io.ObjectOutputStream;
import java.io.ObjectInputStream;

public class ObjectSer {

    
public static void main(String args[]) throws IOException,
            ClassNotFoundException 
{

        Student stu 
= new Student(981036"chb"23"CSD");
        FileOutputStream fo 
= new FileOutputStream("D:/data.txt");
        ObjectOutputStream so 
= new ObjectOutputStream(fo);
        
try {
            so.writeObject(stu);
            so.close();
        }
 catch (IOException e)
        
{
            System.out.println(e);
        }

        stu 
= null;

        FileInputStream fi 
= new FileInputStream("D:/data.txt");
        ObjectInputStream si 
= new ObjectInputStream(fi);
        
try {
            stu 
= (Student) si.readObject();
            si.close();
        }
 catch (IOException e)
        
{
            System.out.println(e);
        }

        System.out.println(
"Student Info:");
        System.out.println(
"ID:" + stu.id);
        System.out.println(
"Name:" + stu.name);
        System.out.println(
"Age:" + stu.age);
        System.out.println(
"Dep:" + stu.department);
    }

}

运行结果如下:

ID:981036
Name:chb
Age:23
Dep:CSD


在这个例子中,我们首先定义了一个类Student,实现了Serializable接口 ,然后通过对象输出流的writeObject()方法将Student对象保存到文件 data.txt中 。之后,通过对象输入流的readObjcet()方法从文件data.ser中读出保存下来的Student对象 。从运行结果可以看到,通过串行化机制,可以正确地保存和恢复对象的状态。

三、串行化的注意事项

1.串行化能保存的元素

串行化只能保存对象的非静态成员交量,不能保存任何的成员方法和静态的成员变量,而且串行化保存的只是变量的值,对于变量的任何修饰符都不能保存。

2.transient关键字

对于某些类型的对象,其状态是瞬时的,这样的对象是无法保存其状态的。例如一个Thread对象或一个FileInputStream对象 ,对于这些字段,我们必须用transient关键字标明,否则编译器将报措。

另外 ,串行化可能涉及将对象存放到磁盘上或在网络上发达数据,这时候就会产生安全问题。因为数据位于Java运行环境之外,不在Java安全机制的控制之中。对于这些需要保密的字段,不应保存在永久介质中 ,或者不应简单地不加处理地保存下来 ,为了保证安全性。应该在这些字段前加上transient关键字。

 

分享到:
评论

相关推荐

    Java关键字Transient与串行化

    在Java编程语言中,`transient`关键字与对象的序列化(serialization)机制密切相关,它在处理对象状态的持久化时扮演着关键角色。本文将深入探讨`transient`关键字的功能、用途以及它如何影响Java对象的序列化过程。 ...

    串行化保存和读取数据示例.zip

    3. **readObject()和writeObject()**:对于复杂的对象,可以重写`writeObject()`和`readObject()`方法来自定义串行化和反串行化的行为。这些方法允许你精确地控制哪些数据应该被保存和恢复。 4. **Externalizable...

    中软公司JAVA培训资料.doc

    实现串行化需实现Serializable接口,并注意私有字段、transient关键字和static字段的影响。 线程是并发执行的程序执行单元。Java中,线程有新建、可运行、运行和终止四种基本状态。线程同步是解决多线程共享资源...

    Java面试题目汇总英文Java面试题(核心知识).doc

    5. **串行化(Serialization)**:Java中,实现`Serializable`接口的对象可以被序列化,便于持久化数据或在网络间传输对象。注意事项包括版本ID(`serialVersionUID`)、transient关键字和static字段不会被序列化。 6...

    【毕业设计】基于yolov9实现目标追踪和计数源码.zip

    【毕业设计】基于yolov9实现目标追踪和计数源码.zip

    MATLAB程序:多个无人船 协同围捕控制算法 3船围捕控制,围捕运动船只 可以仿真多个船之间的距离以及距离目标船的距离,特别适合学习、参考

    MATLAB程序:多个无人船 协同围捕控制算法 3船围捕控制,围捕运动船只 可以仿真多个船之间的距离以及距离目标船的距离,特别适合学习、参考

    基于线性模型预测控制(LMPC)的四旋翼飞行器(UAV)控制

    基于线性模型预测控制(LMPC)的四旋翼飞行器(UAV)控制

    ssm-vue-理发店会员管理系统-源码工程-32页从零开始全套图文详解-34页参考论文-27页参考答辩-全套开发环境工具、文档模板、电子教程、视频教学资源.zip

    资源说明: 1:csdn平台资源详情页的文档预览若发现'异常',属平台多文档混合解析和叠加展示风格,请放心使用。 2:32页图文详解文档(从零开始项目全套环境工具安装搭建调试运行部署,保姆级图文详解)。 3:34页范例参考毕业论文,万字长文,word文档,支持二次编辑。 4:27页范例参考答辩ppt,pptx格式,支持二次编辑。 5:工具环境、ppt参考模板、相关教程资源分享。 6:资源项目源码均已通过严格测试验证,保证能够正常运行,本项目仅用作交流学习参考,请切勿用于商业用途。 7:项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通。 内容概要: 本系统基于 B/S 网络结构,在IDEA中开发。服务端用 Java 并借 ssm 框架(Spring+SpringMVC+MyBatis)搭建后台。前台采用支持 HTML5 的 VUE 框架。用 MySQL 存储数据,可靠性强。 能学到什么: 学会用ssm搭建后台,提升效率、专注业务。学习 VUE 框架构建交互界面、前后端数据交互、MySQL管理数据、从零开始环境搭建、调试、运行、打包、部署流程。

    无人机自动拍摄:Python实现飞行控制与相机捕捉功能详解

    内容概要:本文详细介绍了一种基于 Python 实现无人机自动拍摄的方法,具体涵盖无人机飞行控制系统与摄像头控制的交互流程。主要内容包括:环境搭建、所需第三方库安装、无人机初始化与控制逻辑解析、到达指定地理位置后的摄影动作实现及任务结束后的安全返程指令集发送机制。 适用人群:具有一定编程能力和硬件基础知识的技术爱好者、从事航空影像获取相关领域的工作人员以及自动化设备的研发者。 使用场景及目标:通过本指南可以帮助用户掌握如何构建基本但完整的无人机自动拍摄系统,从而适用于新闻报道、地质勘探、环境监测等多个应用场景中的快速响应数据采集任务。 其他说明:代码实例采用开源软件(如dronekit、opencv等),便于后续开发优化,同时强调了飞行安全性与法律法规遵从的重要意义,鼓励开发者先期模拟测试再逐步应用于实际项目中。

    李团结业务招待费申报表20250104.pdf

    李团结业务招待费申报表20250104.pdf

    2024梦想贩卖机最新升级版变现宝知识付费小程序独立版+前端

    含前后端源码,非线传,修复最新登录接口 梦想贩卖机升级版,变现宝吸取了资源变现类产品的很多优点,摒弃了那些无关紧要的东西,使本产品在运营和变现能力上,实现了质的超越。多领域素材资源知识变现营销裂变独立版。 实现流量互导,多渠道变现。独立部署,可绑自有独立域名不限制域名。

    AirLib - 用于将图片和视频发送到 Apple TV 的 C# 库和客户端应用程序,这是一个基于 Unofficial Airplay 协议规范的 C# 与 Apple TV 连接

    这是一个基于 Unofficial Airplay 协议规范的 C# 与 Apple TV 连接

    【Golang设计模式】使用Golang泛型实现的设计模式(大话设计模式).zip

    【Golang设计模式】使用Golang泛型实现的设计模式(大话设计模式)

    【C语言】2019年南航计算机学院操作系统课程的实验代码-实验心得-上机考试练习-笔试复习笔记_pgj.zip

    【C语言】2019年南航计算机学院操作系统课程的实验代码-实验心得-上机考试练习-笔试复习笔记_pgj

    二十.核心动画 - 新年烟花:资源及源码

    二十.核心动画 - 新年烟花:资源及源码

    【毕业设计】Python 图形化麻将游戏 带蒙特卡洛AI源码.zip

    【毕业设计】Python 图形化麻将游戏 带蒙特卡洛AI源码.zip

    离散数学--自学考试试题(02324)

    离散数学是计算机科学中的一个基础且至关重要的领域,它主要研究不连续的、个体的、离散的数据结构和逻辑关系。02324离散数学自学考试试题集为考研复习提供了宝贵的参考资料,尤其对那些准备复试的学生来说,价值巨大。通过这些试题,考生可以系统地理解和掌握离散数学的基本概念、理论和方法。 离散数学的核心内容包括以下几个方面: 1. **集合论**:集合是最基本的数学概念,离散数学首先会介绍集合的定义、元素关系、集合的运算(如并集、交集、差集、笛卡尔积等)以及集合的性质。此外,还有幂集和良序原理等相关知识。 2. **逻辑与证明**:这包括命题逻辑和一阶逻辑,学习如何使用逻辑符号表达命题,并进行逻辑推理。证明技巧如归纳法、反证法和构造性证明也是重点。 3. **图论**:图是描述对象之间关系的重要工具,学习图的定义、度、路径、环、树等基本概念,以及欧拉图、哈密顿图、最短路径算法等问题。 4. **组合数学**:计数问题是离散数学中的一个重要部分,包括排列、组合、二项式定理、鸽巢原理、容斥原理等。它们。内容来源于网络分享,如有侵权请联系我删除。另外如果没有积分的同学需要下载,请私信我。

    【Golang设计模式】使用Golang泛型实现的设计模式(大话设计模式)_pgj.zip

    【Golang设计模式】使用Golang泛型实现的设计模式(大话设计模式)_pgj

    ssm-jsp-助学贷款-源码工程-32页从零开始全套图文详解-34页参考论文-27页参考答辩-全套开发环境工具、文档模板、电子教程、视频教学资源.zip

    资源说明: 1:csdn平台资源详情页的文档预览若发现'异常',属平台多文档混合解析和叠加展示风格,请放心使用。 2:32页图文详解文档(从零开始项目全套环境工具安装搭建调试运行部署,保姆级图文详解)。 3:34页范例参考毕业论文,万字长文,word文档,支持二次编辑。 4:27页范例参考答辩ppt,pptx格式,支持二次编辑。 5:工具环境、ppt参考模板、相关教程资源分享。 6:资源项目源码均已通过严格测试验证,保证能够正常运行,本项目仅用作交流学习参考,请切勿用于商业用途。 7:项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通。 内容概要: 本系统基于 B/S 网络结构,在 IDEA 中开发。服务端用 Java 并借 ssm 框架(Spring+SpringMVC+MyBatis)搭建后台。用 MySQL 存储数据,可靠性强。 能学到什么: 学会用ssm搭建后台,提升效率、专注业务。学习使用jsp、html构建交互界面、前后端数据交互、MySQL管理数据、从零开始环境搭建、调试、运行、打包、部署流程。

    全方位讲解三菱Q系列QD173H、QD170运动控制器, 是事频,共25个小时的事频讲解,非常详细 需要特殊播放器播放,一机一码,必须电脑本地播放,看清楚再拿哦 Q系列运动控制器是比较高级的内容,专

    全方位讲解三菱Q系列QD173H、QD170运动控制器, 是事频,共25个小时的事频讲解,非常详细。 需要特殊播放器播放,一机一码,必须电脑本地播放,看清楚再拿哦 Q系列运动控制器是比较高级的内容,专门用于运动控制,比如圆弧插补、电子凸轮、同步运动等。 每结课的源程序和QD713H QD170都有,已经配置好了。 如果需要用,根据自己的实际应用稍作修改,灌入PLC就可以。 内容有:QD170 QD713的参数设置、模块介绍和NN通信、指令讲解与JOG编程、opr定位程序初写、QD170M的同步控制、双凸轮控制、凸轮进给、凸轮往复、实模式、虚模式。 可以说这两个模块的所有功能都有讲有。 包括有: 1、PLC源程序 2、QD170 QD713的配置文件 3、事频讲解,专门讲的QD713 这个是Q系列中比较高级的内容,需要比较好的基础 搞定这个15K不是很大的问题,需要好的基础。

Global site tag (gtag.js) - Google Analytics