`
podormeijia
  • 浏览: 5085 次
  • 性别: Icon_minigender_1
  • 来自: 西安
最近访客 更多访客>>
社区版块
存档分类
最新评论

chapter 6 之序列化

    博客分类:
  • SCJP
阅读更多
package chapter6;
import java.io.*;

public class SerializableClass {
	//1.简单序列化(ObjectOutputStream和ObjectInputStream用于序列化)
	public void simpleSerializable(){
		Cat c =new Cat();
		try {
			FileOutputStream fs =new FileOutputStream("testSer.ser");//注意:由于要用ObjectOutputStream包装,所以要用字节形式打开文件
			ObjectOutputStream os =new ObjectOutputStream(fs);
			os.writeObject(c);//工作:1.序列化对象;2.将序列化的对象写入文件
			os.close();
		} catch (FileNotFoundException e) {//在打开文件时,会抛出的异常
			e.printStackTrace();
		} catch (IOException e) {			
			e.printStackTrace();
		}
		try {
			FileInputStream fis =new FileInputStream("testSer.ser");
			ObjectInputStream ois =new ObjectInputStream(fis);
			c =(Cat)ois.readObject();//抛出异常ClassNotFundException,返回的是Object
			ois.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	//2.对象图,Java序列化机制会负责保存对象的整个对象图,将所需的一些内容进行深复制.
	public void ObjectGramm(){
		Collar col =new Collar(3);
		Cat c =new Cat(col,5);
		System.out.println("before:collar size is "+c.getCollar().getCollarSize());
		try {
			FileOutputStream fs =new FileOutputStream("testSer.ser");//换成.txt文件结果是一样的,但是打开txt后,内容基本都是乱码
			ObjectOutputStream os= new ObjectOutputStream(fs);
			os.writeObject(c);
			os.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		try {
			FileInputStream fis =new FileInputStream("testSer.ser");
			ObjectInputStream ois =new ObjectInputStream(fis);
			c =(Cat)ois.readObject();
			ois.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		System.out.println("after: collar size is " +c.getCollar().getCollarSize());
		//outPut is :
		//before:collar size is 3
		//after: collar size is 3
	}
	
	//3.若不能访问Collar的代码,即无法通过修改的方式实现Serializable接口,可用transient修饰符跳过Collar,然后通过两个私有方法,writeObject()和readObject(),来实现序列化
	public void transientUse(){
		Collar col =new Collar(3);
		Dog d =new Dog(col,5);
		System.out.println("before:collar size is "+d.getCollar().getCollarSize());
		try {
			FileOutputStream fs =new FileOutputStream("testSer.ser");
			ObjectOutputStream os= new ObjectOutputStream(fs);
			os.writeObject(d);
			os.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		try {
			FileInputStream fis =new FileInputStream("testSer.ser");
			ObjectInputStream ois =new ObjectInputStream(fis);
			d =(Dog)ois.readObject();
			ois.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		System.out.println("after: collar size is " +d.getCollar().getCollarSize());
		//outPut is :
		//before:collar size is 3
		//after: collar size is 3
	}
	
	//继承关系对序列化的影响,即:子类可以序列化而父类不可以序列化的情况
	//反序列化时,实现Serializable的类,不会调用构造函数,不会初始化;为实现Serializable的类,将初始化。用transient修饰的,若没有上面的那一组方法,则变量为0,对象为null
	public void superNotSerial(){
		Human h =new Human(35, "HaHa");
		System.out.println("before: "+h.name+" "+h.weight);
		try {
			FileOutputStream fs =new FileOutputStream("testSer.ser");
			ObjectOutputStream os= new ObjectOutputStream(fs);
			os.writeObject(h);
			os.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		try {
			FileInputStream fis =new FileInputStream("testSer.ser");
			ObjectInputStream ois =new ObjectInputStream(fis);
			h =(Human)ois.readObject();
			ois.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		System.out.println("after:  "+h.name+" "+h.weight);
		//outPut is:
		//before: HaHa 35
		//after:  HaHa 42
	}
	
	
	public static void main(String[] args){
		SerializableClass sc =new SerializableClass();
		//sc.simpleSerializable();
		//sc.ObjectGramm();
		//sc.transientUse();
		//sc.superNotSerial();
	}
	/**
	 * 
	 *  .ser文件是Java程序源代码中的一种文件。
	 *	Java 程序包括源代码(.java文件)、由编译器生成的类(.class文件)、
	 *	由归档工具jar生成的.jar文件、对象状态序列化.ser文件。
	 *  .jar文件是安装的数据文件,.jad文件是安装的信息文件
	 * */
}

Cat类:
package chapter6;

import java.io.*;

class Cat implements Serializable{
	private Collar theCollar;
	private int catSize;
	public Cat(Collar collar,int size){
		theCollar =collar;
		catSize =size;
	}
	public Cat() {
	}
	public Collar getCollar(){
		return theCollar;
	}
	
}

Collar类
package chapter6;

import java.io.Serializable;

public class Collar implements Serializable{//所有进行深复制的对象,都必须实现Serializable接口
	private int collarSize;
	public Collar(int size) {
		collarSize =size;
	}
	public int getCollarSize(){
		return collarSize;
	}
}

Dog类:
package chapter6;

import java.io.*;

public class Dog implements Serializable {
	transient private Collar theCollar;//transient关键字,表明不用再序列化Collar类了
	private int dogSize;
	public Dog(Collar collar,int size){
		theCollar =collar;
		dogSize =size;
	}
	public Collar getCollar(){
		return theCollar;
	}
	
	private void writeObject(ObjectOutputStream os){
		try {
			os.defaultWriteObject();//告诉JVM对该对象执行常规的序列化过程
			os.writeInt(theCollar.getCollarSize());//将一个额外的Int写入到序列化Dog的流中
		} catch (IOException e) {
			e.printStackTrace();
		}	
	}
	private void readObject(ObjectInputStream is){
		try {
			is.defaultReadObject();//注意读出的时候,要和写入时候的顺序相同。
			theCollar =new Collar(is.readInt());
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
}

Human类:
package chapter6;

import java.io.Serializable;

public class Human extends Animal implements Serializable {
	String name;
	public Human(int w,String n) {
		weight =w;
		name =n;
	}
}


Animal类:
package chapter6;

public class Animal {
	int weight =42;//初始化为42
}

分享到:
评论

相关推荐

    安卓平台应用开发-XML序列化,存储客户信息

    在`chapter04`这个文件夹中,可能包含了实现上述功能的代码示例,包括XML序列化的具体实现、QQ登录的逻辑以及天气预报数据的处理。通过分析这些代码,开发者可以深入理解如何在Android应用中有效地使用XML进行数据...

    Chapter 6 Mouse and Keyboard Input vb版

    一些有用的技巧包括使用断点来跟踪事件流程,打印调试信息以了解事件的触发顺序,以及使用可视化工具来辅助调试过程。 #### 关于绘图事件 绘图事件是处理图形界面的重要组成部分。理解绘图事件的工作原理有助于...

    SCJP Sun® Certified Programmer for Java™ 6 Study Guide chapter 15

    ### SCJP Sun® Certified Programmer for Java™ 6 Study Guide Chapter 15:Networking Issues #### 知识点概览 本章重点在于理解和处理网络编程中的常见问题,尤其是在准备Sun认证Java程序员(SCJP)考试时。...

    chapter10 codes&data_金融时间序列分析代码_

    本章节我们将深入探讨"chapter10 codes&data"中的关键知识点,了解如何使用R语言对金融时间序列进行建模、预测和可视化。 1. **时间序列基础** - 时间序列是由特定时间点上的观测值组成的数据序列,通常按照时间...

    chapter9 codes&data_金融时间序列书的代码_

    在"chapter9 codes&data"这个压缩包中,我们可以预期包含了一系列的R脚本文件,这些脚本可能用于处理、清洗、可视化以及建模金融时间序列数据。以下是一些可能涉及的知识点: 1. **时间序列基础知识**:时间序列是...

    Chapter 6处理不同类型的数据1

    - **JSON**:Spark支持JSON数据的解析和序列化,可以使用`from_json()`和`to_json()`函数进行操作。 7. **用户自定义函数(UDF)**: 当标准库函数无法满足需求时,可以定义UDF来扩展Spark的功能。UDF允许将Scala...

    Chapter9.zip

    在 Android 开发中,JSON 常用来序列化和反序列化数据,以便与服务器进行数据交换。 这些文件和目录组合在一起,暗示这个“Chapter9.zip”可能是一个关于 Android 应用开发的教程或示例项目,涵盖了网络请求、页面...

    chapter01.rar

    在SpringBoot项目中,我们通常会看到`spring-boot-starter-web`依赖,它是SpringBoot启动器,包含了处理HTTP请求、JSON序列化等功能。此外,可能还有其他如数据库连接、日志记录等相关的依赖。 2. **源代码目录**:...

    News_chapter_8_java_新闻中国_

    5. **JSON解析**:新闻数据通常以JSON格式传输,因此需要使用Gson或Jackson等库进行JSON数据的解析和序列化。 6. **数据库操作**:可能需要使用MySQL、Oracle或MongoDB等数据库存储新闻条目,JDBC或JPA进行数据库...

    从零开始学iOS7开发系列教程-事务管理软件开发实战-Chapter141

    在iOS应用程序开发中,尤其是在构建复杂的事务管理系统时,了解对象的序列化与反序列化是至关重要的。本章节我们将探讨如何从头开始学习iOS7开发,特别是针对事务管理软件的实战技巧,涉及到对象的持久化存储以及...

    chapter 1_chapter在Python_python_

    "Chapter 1"通常标志着一个教程或教材的开始,这里我们将深入探讨Python的基础知识,包括结构化设计、函数、模型以及面向对象编程。 1. 结构化设计: 结构化设计是编程的基本原则,它强调程序的逻辑性和可读性。在...

    chapter11 codes&data_金融时间序列分析书代码_

    2. **数据预处理**:在分析金融时间序列前,通常需要对数据进行清洗和预处理,包括处理缺失值、异常值,以及对数据进行标准化或归一化,以消除不同尺度的影响。 3. **平稳性检验**:平稳性是时间序列分析的基础,...

    MIT6_02F12_chap08 6.02 Notes, Chapter 8

    尽管硬判决解码仍然产生了给定接收比特序列最有可能的传输序列,但由于在早期数字化过程中引入了额外的错误,整体比特错误概率的减少将比软判决解码小。但是,硬判决解码在概念上更容易理解,因此我们将从硬判决解码...

    chapter15_信息粒化_神经网络预测_回归网络_SVM_

    在时间序列预测中,信息粒化可以用于识别数据的关键特征,为预测模型提供更有针对性的输入。 接下来,我们讨论**神经网络预测**。神经网络是一种模仿人脑神经元结构的计算模型,能够从大量数据中学习并进行预测。在...

    chapter10.zip

    它在创建动态代理、序列化、单元测试等方面有广泛应用。 6. **设计模式**:Java实践中常常会运用到各种设计模式,如单例模式、工厂模式、观察者模式等,这些模式为解决常见的编程问题提供了标准化的解决方案。 7. ...

    PHP.Web.2.0开发实战 随书源码chapter-07

    在PHP中,可以使用json_encode和json_decode函数进行数据的序列化和反序列化。 3. **jQuery库**:jQuery是JavaScript的一个库,简化了DOM操作、事件处理和动画效果。学习如何在PHP项目中集成jQuery,能极大地提高...

    算法设计英文版课件:Chapter 6 Prune-and-search.ppt

    Chapter 6 of the "Algorithm Design" course material, titled "Prune-and-search," delves into the principles and analysis of computer algorithms. The primary focus is on understanding efficiency, ...

    毕业设计Chapter05

    1. **需求分析与设计**:在这一阶段,你需要确保对项目的需求有深入理解,并且已经创建了详细的设计文档,包括用例图、类图、序列图等UML(统一建模语言)图表。 2. **数据库设计**:Chapter05可能涉及到数据库结构...

    chapter 02_时间信号与系统_

    1. **单位取样序列**:单位取样序列是一种在离散时间信号处理中常见的理想化信号。它是一个在每个整数时刻等于1,在非整数时刻为0的序列,通常表示为δ[n]。这个序列在分析离散系统的响应和滤波器设计中起到关键作用...

Global site tag (gtag.js) - Google Analytics