`
12616383
  • 浏览: 51520 次
  • 性别: Icon_minigender_1
  • 来自: 待定
社区版块
存档分类
最新评论

java_croe 学习笔记之对象流

阅读更多

一、串行化的概念和目的

1.什么是串行化

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

2.串行化的目的

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

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

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

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

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

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

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

            Serializable接口中没有任何的方法。当一个类声明要实现Serializable接口时,只是表明该类参加串行化协议,而不需要实现任何特殊的方法。下面我们通过实例介绍如何对对象进行串行化。 (转自http://blog.csdn.net/sodino/archive/2008/12/21/3576147.aspx

 

 

关于对象序列化和反序列化的顺序:反序列化是按照序列化的顺序进行读取的,所以反序列化的时候一定要按照序列化的顺序读取

 

 

自己写的列子

package twelve;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Date;
import java.util.GregorianCalendar;

/**
 * @Title ObjectFileTest.java
 * @description TODO
 * @author qinpeng
 * @date Aug 19, 2009 10:40:49 PM
 */
public class ObjectFileTest {

	public static void main(String[] args) {

		ObjectOutputStream out = null;
		ObjectInputStream in = null;

		Manager boss = new Manager("carl c", 8000, 1987, 12, 15);
		boss.setBonus(5000);

		Employee[] staff = new Employee[3];
		staff[0] = boss;
		staff[1] = new Employee("harry", 5000, 1985, 8, 21);
		staff[2] = new Employee("tony", 4000, 1986, 6, 12);

		try {
			try {
				out = new ObjectOutputStream(new FileOutputStream(
						"employee.dat"));
				out.writeObject(staff);
			} finally {
				if (out != null) {
					out.close();
				}
			}
		} catch (FileNotFoundException foundE) {
			foundE.printStackTrace();
			System.err.print("employee.dat  is not found");
		} catch (IOException ioE) {
			ioE.printStackTrace();
			System.err.print("IOException of main");
		}

		try {
			try {
				in = new ObjectInputStream(new FileInputStream("employee.dat"));
				Employee[] newStaff = (Employee[]) in.readObject();
				for (Employee e : newStaff) {
					System.out.println(e);
				}
			} finally {
				if (in != null) {
					in.close();
				}
			}

		} catch (ClassNotFoundException classE) {
			classE.printStackTrace();
			System.err.print("employee.dat  is not found");
		} catch (FileNotFoundException foundE) {
			foundE.printStackTrace();
			System.err.print("employee.dat  is not found");
		} catch (IOException ioE) {
			ioE.printStackTrace();
			System.err.print("IOException of main");
		}
	}

}

class Employee implements Serializable {

	private  String name;
	//private transient String name;
	private double salary;
	private Date hireDay;

	public Employee() {
	}

	public Employee(String n, double s, int year, int month, int day) {
		name = n;
		salary = s;
		GregorianCalendar claendar = new GregorianCalendar(year, month - 1, day);
	}

	public void raiseSalary(double byPercent) {
		double raise = salary * byPercent / 100;
		salary += raise;
	}

	public String toString() {

		return getClass().getName() + "name=" + name + "---salary=" + salary
				+ "---hirDay=" + hireDay;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public double getSalary() {
		return salary;
	}

	public void setSalary(double salary) {
		this.salary = salary;
	}

	public Date getHireDay() {
		return hireDay;
	}

	public void setHireDay(Date hireDay) {
		this.hireDay = hireDay;
	}
}

class Manager extends Employee {

	private double bonus;

	public Manager(String n, double s, int year, int month, int day) {
		super(n, s, year, month, day);
	}

	public String toString() {

		return super.toString() + "bonus=" + bonus;
	}

	public double getSalary() {
		double baseSalay = super.getSalary();
		return baseSalay + bonus;
	}

	public double getBonus() {
		return bonus;
	}

	public void setBonus(double bonus) {
		this.bonus = bonus;
	}

}

   这里当域没有用 transient  修饰的时候,该域作为对象的内容被保存起来。输出结果如下:

 

   twelve.Managername=carl c---salary=8000.0bonus=5000.0
   twelve.Employeename=harry---salary=5000.0
   twelve.Employeename=tony---salary=4000.0

 

  如果域 name 使用 transient   该域将不会进行保存

 

class Employee implements Serializable {

	//private  String name;
	private transient String name;
	private double salary;
	private Date hireDay;
........

 结果如下:

 

twelve.Managername=null---salary=8000.0bonus=5000.0
twelve.Employeename=null---salary=5000.0
twelve.Employeename=null---salary=4000.0

 

0
0
分享到:
评论
2 楼 12616383 2009-08-20  
form_rr 写道
序列化java对象时,一定要指定 serialVersionUID ,
否则修改过的类在反序列化的时候会报错的!!!



我也是刚学 对象流 和序列化,请前辈说得具体些,是我修改时要指定对象的 序列ID 是吧
1 楼 form_rr 2009-08-20  
序列化java对象时,一定要指定 serialVersionUID ,
否则修改过的类在反序列化的时候会报错的!!!

相关推荐

    Java croe java 思想

    其次,Java的面向对象特性是其核心思想之一。书中深入讲解了类、对象、封装、继承、多态等面向对象的基本概念。理解类与对象的关系,如何通过类来抽象现实世界中的实体,如何利用继承实现代码的复用,以及多态性如何...

    hibernate aip hibernate aip

    Hibernate作为一款强大的对象关系映射(ORM)工具,极大地简化了Java应用程序与数据库之间的交互。在这个过程中,我们将深入探讨Hibernate的核心概念、工作原理以及如何在实际项目中有效地运用Hibernate AIP。 首先...

    求CROE2E6300+MSI945PNEO3的超频方案

    在探讨CROE2E6300处理器与MSI 945P NEO3主板的超频方案之前,我们首先要理解几个关键概念和技术限制。E6300是一款基于Intel Core微架构的CPU,拥有良好的超频潜力,而945P NEO3主板则是基于Intel 945P芯片组设计,它...

    实时关注你cpu的温度croetemp

    标题“实时关注你CPU的温度CoreTemp”所指的是一个名为CoreTemp的小巧工具,它专门用于监测计算机中央处理器(CPU)的温度。CoreTemp是一款强大的系统监控软件,它能够提供准确、实时的CPU温度信息,帮助用户了解...

    Creo Elements Pro 5.0中文版实例教程_张克义

    Creo Elements Pro 5.0 中文版是该软件的本地化版本,便于中文用户学习和使用。张克义作为该教程的主编,编写的《Creo Elements Pro 5.0中文版实例教程》是一本面向广大工程设计人员以及相关专业学生的技术指导书籍...

    zxing1.7croe

    谷歌二维码生成 二维码,在网上很火,以前没有太多的关注,最近想了解一下,就找了些博客看一下,主要是关于Google的,下面分享一篇博客,写的很好了。

    Croe PDX10.0冲压模具设计菜单汉化包

    creo pdx10.0冲模专家 菜单汉化包 PDX10.0配合Creo4.0使用,一个简体汉化包分享给网友。 汉化方法: 压缩包解压后,将如图所示两个目录复制粘贴到PDX10.0目录下,启动Creo4.0即可显示中文简体的pdx界面了

    creo3模具设计教程

    次教程为creo3.0swf格式的电子书文件配套学习书籍之一,供学习爱好者方便学习

    PTC_Creo_3.0_M040_Win64破解文件

    PTC_Creo_3.0_M040_Win64破解文件

    69M2V1.zip

    学习和使用CROE通常需要一定的数学和编程背景,特别是线性代数、概率论和统计学知识。此外,熟悉金融市场的运作和投资原理也是必不可少的。如果你是初学者,建议从官方文档、教程或在线课程开始,逐步了解CROE的功能...

    Creo 教程——模型拼接拉伸技巧.pdf

    **Creo 模型拼接拉伸技巧详解** 在三维建模软件Creo中,模型拼接拉伸是一项重要的设计技巧,它可以帮助设计师构建复杂的几何形状。本教程将通过一个具体的实例来阐述如何运用这一技术。 ### 步骤一:创建外形特征 ...

    creo3.0-config.pro配置文件详解

    - **应用场景**:在处理大型图纸时,如果需要批量删除对象,可以启用此选项以提高效率。 ##### allow_workpiece_silhouette - **说明**:此选项决定了工件是否可用于创建轮廓加工窗口。 - **值**: - `yes`:允许...

    DUMP_C++_dump_

    在C++编程中,捕获内存相关错误并生成dump文件是一项关键的技术...对于`DUMP_C++_dump_`这个主题,学习如何在C++代码中正确地捕获异常、设置调试钩子以及使用调试工具分析dump文件,是每一个高级C++开发者必备的技能。

    creo3.0表述式曲线(croe3.0曲线表达式或proe表达式曲线)[汇编].pdf

    Creo 3.0 表述式曲线知识点大全 Creo 3.0 表述式曲线是 Pro/Engineer(PROE)软件中的一个功能强大且灵活的设计工具,allows users to create complex curves using mathematical equations. 这种曲线可以应用于...

    自动编码识别 BOM

    jchardet是一个基于Mozilla自动字符集探测算法的Java移植版,最初由Frank Tang开发,后来被移植到Java。这个库可以极大地帮助Java开发者解决编码识别问题。要使用jchardet,首先需要将其引入到项目中。然后,需要...

    钢管切割机Creo 7.0_零件图_机械工程图_机械三维3D设计图打包下载.zip

    总结来说,这个压缩包提供了一整套钢管切割机的Creo 7.0设计资料,涵盖了从零部件到整体工程图的全面信息,是学习机械设计、了解切割机结构或进行定制设计的宝贵资源。通过解压并探索这些文件,用户可以深入了解Creo...

    钣金折弯系数

    钣金折弯系数是钣金设计中的一个重要概念,它涉及到PROE等三维建模软件在处理钣金折弯和展平时的计算。在钣金加工过程中,材料在折弯时会发生内部拉伸或压缩,折弯系数就是用来描述这种变形的程度。...

    creo3.0配置文件详细设置

    在三维建模软件Creo 3.0中,配置文件(.prf文件)是控制程序行为和用户界面的关键元素。这些文件允许用户根据个人习惯和项目需求定制软件的各个方面,包括显示设置、单位系统、内存分配、启动选项等。...

    Creo3.0配置文件-2014A版-精诚网

    让CREO设计效率与规范不断的提高 最近安装了PTC Creo Parametric 3.0,其配置选项与Creo Parametric 2.0有部分更改,研究PTC Creo® 3.0 Parametric 配置选项configoptions.pdf,再次整理一下自己正在使用的配置选项...

Global site tag (gtag.js) - Google Analytics