`
12616383
  • 浏览: 51697 次
  • 性别: 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

    随着处理器负载的增加,核心温度也会随之升高。过高的温度可能会导致处理器降频,甚至触发保护机制,导致电脑重启。使用CoreTemp这类工具,用户可以确保处理器温度始终保持在一个安全的范围内,避免因过热带来的性能...

    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...

    钣金折弯系数

    总结而言,钣金折弯系数是确保钣金零件设计精确度和制造效率的关键因素之一。通过正确计算和应用折弯系数,设计师可以精确控制钣金件的尺寸和形状,保证产品质量,减少生产成本。对于钣金设计和制造行业而言,掌握...

    creo3.0配置文件详细设置

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

    PROE 5.0造型设计

    proe 5.0的造型设计设计类型为手机,可为初次设计者提供参考

Global site tag (gtag.js) - Google Analytics