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

java_croe 学习笔记之对象流 (补充1 保存对象引用)

阅读更多

保存对象引用:

基于前面的例子,我们现在假设每个Manager 都拥有一个秘书Employee,而且一个或者多个Manager 拥有的是同一个秘书,我们不希望保存对象流时出现这种状况, 2个manager  一个秘书employee ,保存时,一共保存了3个employee。这样的话当希望对秘书employee 作出修改时,必须找出其他拷贝对象,再逐一修改。

 

我们希望做的是只保存和恢复秘书的一个拷贝,磁盘上的对象与内存中的对象布局完全一致。称其为 持久性 。想要达到这种效果,java 使用序列化的 方法,也就是 对象序列化:

1 所有保存到磁盘的对象都有一个序列

2 当向磁盘存储一个对象时,先检查是否有相同的对象存在

3 如果有相同对象,就只需要写入 已经存储对象序列号。如果没有,写入对象数据,生成序列号。

 

看下例子: 当修改秘书employee 时,manager 中引用的 employee 同样发生改变

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);
		Employee harry = new Employee("harry", 5000, 1985, 8, 21);
		boss.setBonus(5000);
		boss.setSecretary(harry);
		
		Employee[] staff = new Employee[3];
		staff[0] = boss;
		staff[1] = harry;
		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();
				
				newStaff[1].raiseSalary(10);
				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;
	}

	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;
	private Employee secretary ;

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

	public String toString() {
		return super.toString() + "bonus=" + bonus+"-------secretary's salary = "+secretary.getSalary();
	}
	
	public void setSecretary(Employee s) {
		this.secretary = s;
	}

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

	public double getBonus() {
		return bonus;
	}

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

}

  输出:

twelve.Managername=carl c---salary=8000.0bonus=5000.0-------secretary's salary = 5500.0
twelve.Employeename=harry---salary=5500.0
twelve.Employeename=tony---salary=4000.0

0
0
分享到:
评论

相关推荐

    Java croe java 思想

    《Java核心编程思想》是Java开发者的一本经典之作,它深入浅出地讲解了Java语言的核心概念和技术,旨在提升读者的编程思维和实战能力。这本书的内容涵盖了Java的基础语法、面向对象设计、异常处理、集合框架、多线程...

    purge.exe 用于Creo每次保存文件会出现重复文件没替换,双击此程序会自动帮你清除重复文件,放在保存该文件同一个目录里

    仅用于Creo软件。Creo每次保存不会替换源文件,这个可以自己在软件设置的,不用我的这purge.exe程序,不会软件设置操作或设置的不成功的需要的人使用。

    hibernate aip hibernate aip

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

    69M2V1.zip

    "69M2V1.zip" 是一个压缩文件,其中包含了一个或多个与"CROE"相关的文件。CROE通常指的是"Computational Risk and Optimization Engine",这是一个在金融、工程和其他领域中用于处理复杂风险分析和优化问题的计算...

    求CROE2E6300+MSI945PNEO3的超频方案

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

    实时关注你cpu的温度croetemp

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

    zxing1.7croe

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

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

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

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

    1. 首先,创建一个名为DTM1的基准平面,选择模型底面并向上偏移2mm。 2. 使用DTM1基准面作为草绘平面,绘制弧形截面图形。 3. 再次执行拉伸操作,选择“实体剪材料”方式,设置深度为“穿透所有”,这样就形成了中间...

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

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

    creo3模具设计教程

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

    DUMP_C++_dump_

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

    PTC_Creo_3.0_M040_Win64破解文件

    PTC_Creo_3.0_M040_Win64破解文件

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

    18. Rhodonea 曲线采用笛卡尔坐标系方程:theta=t*360*4 x=25+(10-6)*cos(theta)+10*cos((10/6-1)*theta) y=25+(10-6)*sin(theta)-6*sin((10/6-1)*theta) 这种曲线用于设计 Rhodonea 曲线形零件,如 Rhodonea 曲线...

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

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

    creo3.0配置文件详细设置

    通过设置“AUTO_SAVE_INTERVAL”可以定时自动保存文件,防止因意外情况丢失工作。同时,“BACKUP_FILES=YES”可开启自动备份功能,保护您的工作安全。 **七、显示和图形设置** 配置文件可以调整模型渲染质量,如...

    自动编码识别 BOM

    = -1) { if (isAscii) isAscii = det.isAscii(buf,len); if (!isAscii && !done) done = det.DoIt(buf,len, false); } det.DataEnd(); if (isAscii) { System.out.println("CHARSET = ASCII"); found = true ;...

    钣金折弯系数

    而K系数,作为这个公式中的一个关键变量,是一个范围在0到1之间的参数,用于描述材料在折弯时的抵抗程度。K系数越大,表示材料的弹性模量越大,抵抗变形的能力越强,折弯时的拉伸或压缩程度越小。 为了更准确地计算...

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

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

Global site tag (gtag.js) - Google Analytics