`
liao_ybu
  • 浏览: 687 次
  • 性别: Icon_minigender_1
  • 来自: 吉林省
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

学习Java序列化的一些收获

阅读更多

1.修改默认的序列化机制:

       在java中有些对象是不能够用默认的序列化机制来写入磁盘的,如Rectangle2D.Double、Rectangle2D.Float、Point2D.Double、Point2D.Float等类的对象。如果一个类的数据域包含了这些类对象,我们应该用transient关键字标记,表明这样的数据域不能被默认的序列化机制写入磁盘。如果我们要用ObjectOutputStream将这些对象的数据写入磁盘,并且想用ObjectInputStream将其读入到相应的对象中的时侯,我们就应该修改默认的序列化机制。

 

import java.awt.geom.Point2D;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;


public class IOTest 
{
	@SuppressWarnings("deprecation")
	public static void main(String [] args) throws IOException, ClassNotFoundException
	{
		
		//修改默认的序列化机制
		System.out.println("---------------修改默认的序列化机制-----------------\n");
		LabeledPoint point=new LabeledPoint("Override default",new Point2D.Double(23.4,23.5));
		ObjectOutputStream outPoint=new ObjectOutputStream(new FileOutputStream("noDefault.txt"));
		outPoint.writeObject(point);
		outPoint.close();
		
		ObjectInputStream inPoint=new ObjectInputStream(new FileInputStream("noDefault.txt"));
		LabeledPoint savedPoint=(LabeledPoint)inPoint.readObject();
		inPoint.close();
		System.out.println(savedPoint==null?"savedPoint==null":savedPoint.toString());
		
	}
}
@SuppressWarnings("serial")
class LabeledPoint implements Serializable
{
	private String label;
	private transient Point2D.Double point;
	
	public LabeledPoint(String l,Point2D.Double p)
	{
		label=l;
		point=p;
	}
	
	private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException
	{
		in.defaultReadObject();
		double x=in.readDouble();
		double y=in.readDouble();
		point=new Point2D.Double(x,y);
		System.out.println("call LabeledPoint.readObject()");
	}
	
	private void writeObject(ObjectOutputStream out) throws IOException
	{
		out.defaultWriteObject();
		out.writeDouble(point.getX());
		out.writeDouble(point.getY());
		System.out.println("call LabeledPoint.writeObject()");
	}
	
	@Override
	public String toString()
	{
		return label+(point==null?"":("("+point.getX()+","+point.getY()+")"))+"\n";
	}
}

  

 

 

  我们还有另外一种修改默认的序列化机制的方法,那就是实现Externalizable接口。注意:用这种方法时一定要为实现了Externalizable接口的类提供一个默认的构造函数。因为再度入对象时,对象流将用默认的构造函数创建一个对象,然后调用readExternal方法。

 

 

import java.io.Externalizable;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Date;

public class IOTest 
{
    	//实现Externalizable接口
		System.out.println("---------------实现Externalizable接口----------------\n");
		Employee em=new Employee("Harry",3434.434,new Date());
		ObjectOutputStream outEm=new ObjectOutputStream(new FileOutputStream("externalizable.txt"));
		outEm.writeObject(em);
		outEm.close();
		
		ObjectInputStream inEm=new ObjectInputStream(new FileInputStream("externalizable.txt"));
		Employee savedEm=(Employee)inEm.readObject();
		inEm.close();
		System.out.println(savedEm);
	}
}
class Employee implements Externalizable
{
	public Employee()
	{
		
	}
	public Employee(String name,double salary,Date hireDay)
	{
		this.name=name;
		this.salary=salary;
		this.hireDay=hireDay;
	}
	
	@Override
	public void readExternal(ObjectInput in)throws IOException
	{
		name=in.readUTF();
		salary=in.readDouble();
		hireDay=new Date(in.readLong());
		System.out.println("调用Employee.readExternal()");
	}
	
	@Override
	public void writeExternal(ObjectOutput out)throws IOException
	{
		out.writeUTF(name);
		out.writeDouble(salary);
		out.writeLong(hireDay.getTime());
		System.out.println("调用Employee.writeExternal()");
	}
	
	@Override
	public String toString()
	{
		return "Employee:"+name+" "+salary+" "+hireDay;
	}
	
	private String name;
	private double salary;
	private Date hireDay;
	
}

 

分享到:
评论

相关推荐

    Java学习材料(499篇文章)--经典的java学习资料

    7. **输入/输出流**:Java的IO流处理能力强大,包括文件操作、网络通信、对象序列化等。了解流的分类(如字节流和字符流)和使用方式对处理数据交换很重要。 8. **反射机制**:Java的反射机制允许在运行时检查类、...

    Java Java学习文档 Java程序设计 Java语言

    包括字节流、字符流、缓冲流、对象序列化等概念。 6. **多线程**:Java内置对多线程的支持,让你能编写并发程序。会讲解线程的创建方式(继承Thread类和实现Runnable接口),同步机制(synchronized关键字、wait()...

    java套接字记事本文件学习

    4. **流的读写**:学会使用InputStream和OutputStream进行字节流的读写操作,包括字节、字符串和对象的序列化与反序列化。 5. **并发处理**:如果服务器需要同时处理多个客户端的连接,需要了解多线程或异步编程。 ...

    纯java编学的学生成绩管理系统

    3. **I/O流**:学习如何读写文件,可能涉及到序列化和反序列化,以保存和加载系统配置或用户数据。 4. **集合框架**:如ArrayList、LinkedList、HashMap等数据结构的使用,用于存储和操作学生和成绩数据。 5. **JDBC...

    java高职实训

    5. **IO流**:Java的IO流用于数据的输入输出,包括字符流和字节流,以及文件操作、对象序列化等。学生会在实训中学习如何读写文件,以及如何进行数据的传输。 6. **多线程**:Java提供了强大的多线程支持,实训会...

    Java_Web开发实战经典 李新华 课后习题答案

    11. **JSON数据格式**:学习JSON的语法,以及如何在Java中序列化和反序列化JSON对象。 12. **Junit单元测试**:了解如何编写和运行单元测试,确保代码的正确性和可维护性。 在解决课后习题时,你将逐步提升对这些...

    让你在21天内学通java

    5. **输入/输出(I/O)**:学习如何使用Java的I/O流进行文件读写,包括字节流和字符流,以及缓冲区和对象序列化的概念。 6. **多线程**:Java内置对多线程的支持,理解线程的创建、同步、生命周期管理以及线程池的...

    java 二手车交易系统(完全文件流操作)

    2. **数据序列化与反序列化**:为了将对象持久化到文件中,系统可能使用了Java的序列化机制。通过实现`Serializable`接口,对象可以被转换为字节流并写入文件,反之,通过反序列化可以从文件中恢复对象。这在处理...

    java速成100天

    5. **输入输出流**:学习I/O流的概念,包括文件操作、对象序列化以及网络通信中的数据传输。 6. **多线程**:Java支持多线程编程,了解Thread类和Runnable接口,以及同步机制(synchronized关键字、wait()、notify...

    自考 java 历年真题

    历年真题中可能包含读写文件、数据序列化等实践性的题目。 此外,集合框架是Java编程中的一个重要部分,包括List、Set、Map等接口及其实现类,如ArrayList、LinkedList、HashSet、HashMap等。考生需理解各种集合的...

    java课件

    12. **输入/输出流**:涵盖文件I/O、字节流、字符流,以及对象序列化和反序列化。 13. **多线程**:介绍线程的创建方式(实现Runnable接口和继承Thread类),线程同步机制(synchronized、wait()、notify()、...

    thinking in java 中文最新版

    5. **输入/输出系统**:包括文件操作、流的概念、序列化和网络编程。这部分内容帮助读者理解如何在Java中读写文件,如何通过网络进行通信,以及如何实现对象的持久化。 6. **多线程**:Java对多线程的支持非常强大...

    Java_day02上课资料.zip

    7. **IO流**:讲解输入输出流的概念,包括字节流和字符流,以及文件操作和对象序列化。 8. **多线程**:介绍并发编程的基础,包括线程的创建、同步机制(synchronized关键字、wait()、notify()等)、线程池和并发...

    Java夜未眠.程序员的心声(故事书一样的专业书)

    5. **IO流**:讲解Java的输入/输出流系统,包括文件操作、字节流、字符流、对象序列化和文件复制等。 6. **多线程**:介绍并发编程的概念,如线程的创建、同步机制(synchronized关键字、wait()、notify()方法)、...

    2020超全Java汇总,私藏免费分享了

    包括文件操作、网络通信、对象序列化等,需要熟悉InputStream、OutputStream、Reader、Writer以及BufferedReader、BufferedWriter等类。 6. **多线程**:Java提供了强大的多线程支持,通过Thread类和Runnable接口...

    java编程100个例子

    9. **反射**:Java反射允许程序在运行时检查和修改自身,这在插件系统、序列化等方面很有用。 10. **注解(Annotation)**:注解提供了一种元数据的方式,例子将演示如何创建和使用注解,以及如何通过反射处理注解。 ...

    Java课程设计你画我猜小游戏之你猜我猜不猜。.zip

    这涉及到数据的序列化和反序列化,以及网络协议的理解。 5. **多线程**:为了实现游戏的并行操作,如玩家同时绘制和猜测,可能需要使用到Java的多线程技术。理解线程的创建、同步和通信机制是必要的。 6. **文件...

    Java版打飞机小游戏

    Java的序列化技术或者外部文件存储都可以实现这一功能。 5. 声音效果(Sound Effects):为了增加游戏体验,可以添加背景音乐和音效。Java Sound API提供了一套完整的音频处理框架,可以加载、播放和控制音效。 接...

    坦克大战游戏java

    5. **数据持久化**:游戏可能包含保存和读取进度的功能,这需要使用到Java的文件操作和序列化技术,将游戏状态写入文件,下次启动时再恢复。 6. **多线程**:为了保证游戏流畅性,通常会用到多线程技术。例如,游戏...

    java面试资料.rar

    6. **IO流**:了解不同类型的流(字节流和字符流)、缓冲流、转换流、对象序列化以及NIO(New IO)框架。 7. **反射**:掌握如何通过反射动态调用方法、创建对象和修改类的属性,以及其在实际应用中的场景。 8. **...

Global site tag (gtag.js) - Google Analytics