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;
}
分享到:
相关推荐
7. **输入/输出流**:Java的IO流处理能力强大,包括文件操作、网络通信、对象序列化等。了解流的分类(如字节流和字符流)和使用方式对处理数据交换很重要。 8. **反射机制**:Java的反射机制允许在运行时检查类、...
包括字节流、字符流、缓冲流、对象序列化等概念。 6. **多线程**:Java内置对多线程的支持,让你能编写并发程序。会讲解线程的创建方式(继承Thread类和实现Runnable接口),同步机制(synchronized关键字、wait()...
4. **流的读写**:学会使用InputStream和OutputStream进行字节流的读写操作,包括字节、字符串和对象的序列化与反序列化。 5. **并发处理**:如果服务器需要同时处理多个客户端的连接,需要了解多线程或异步编程。 ...
3. **I/O流**:学习如何读写文件,可能涉及到序列化和反序列化,以保存和加载系统配置或用户数据。 4. **集合框架**:如ArrayList、LinkedList、HashMap等数据结构的使用,用于存储和操作学生和成绩数据。 5. **JDBC...
5. **IO流**:Java的IO流用于数据的输入输出,包括字符流和字节流,以及文件操作、对象序列化等。学生会在实训中学习如何读写文件,以及如何进行数据的传输。 6. **多线程**:Java提供了强大的多线程支持,实训会...
11. **JSON数据格式**:学习JSON的语法,以及如何在Java中序列化和反序列化JSON对象。 12. **Junit单元测试**:了解如何编写和运行单元测试,确保代码的正确性和可维护性。 在解决课后习题时,你将逐步提升对这些...
5. **输入/输出(I/O)**:学习如何使用Java的I/O流进行文件读写,包括字节流和字符流,以及缓冲区和对象序列化的概念。 6. **多线程**:Java内置对多线程的支持,理解线程的创建、同步、生命周期管理以及线程池的...
2. **数据序列化与反序列化**:为了将对象持久化到文件中,系统可能使用了Java的序列化机制。通过实现`Serializable`接口,对象可以被转换为字节流并写入文件,反之,通过反序列化可以从文件中恢复对象。这在处理...
5. **输入输出流**:学习I/O流的概念,包括文件操作、对象序列化以及网络通信中的数据传输。 6. **多线程**:Java支持多线程编程,了解Thread类和Runnable接口,以及同步机制(synchronized关键字、wait()、notify...
历年真题中可能包含读写文件、数据序列化等实践性的题目。 此外,集合框架是Java编程中的一个重要部分,包括List、Set、Map等接口及其实现类,如ArrayList、LinkedList、HashSet、HashMap等。考生需理解各种集合的...
12. **输入/输出流**:涵盖文件I/O、字节流、字符流,以及对象序列化和反序列化。 13. **多线程**:介绍线程的创建方式(实现Runnable接口和继承Thread类),线程同步机制(synchronized、wait()、notify()、...
5. **输入/输出系统**:包括文件操作、流的概念、序列化和网络编程。这部分内容帮助读者理解如何在Java中读写文件,如何通过网络进行通信,以及如何实现对象的持久化。 6. **多线程**:Java对多线程的支持非常强大...
7. **IO流**:讲解输入输出流的概念,包括字节流和字符流,以及文件操作和对象序列化。 8. **多线程**:介绍并发编程的基础,包括线程的创建、同步机制(synchronized关键字、wait()、notify()等)、线程池和并发...
5. **IO流**:讲解Java的输入/输出流系统,包括文件操作、字节流、字符流、对象序列化和文件复制等。 6. **多线程**:介绍并发编程的概念,如线程的创建、同步机制(synchronized关键字、wait()、notify()方法)、...
包括文件操作、网络通信、对象序列化等,需要熟悉InputStream、OutputStream、Reader、Writer以及BufferedReader、BufferedWriter等类。 6. **多线程**:Java提供了强大的多线程支持,通过Thread类和Runnable接口...
9. **反射**:Java反射允许程序在运行时检查和修改自身,这在插件系统、序列化等方面很有用。 10. **注解(Annotation)**:注解提供了一种元数据的方式,例子将演示如何创建和使用注解,以及如何通过反射处理注解。 ...
这涉及到数据的序列化和反序列化,以及网络协议的理解。 5. **多线程**:为了实现游戏的并行操作,如玩家同时绘制和猜测,可能需要使用到Java的多线程技术。理解线程的创建、同步和通信机制是必要的。 6. **文件...
Java的序列化技术或者外部文件存储都可以实现这一功能。 5. 声音效果(Sound Effects):为了增加游戏体验,可以添加背景音乐和音效。Java Sound API提供了一套完整的音频处理框架,可以加载、播放和控制音效。 接...
5. **数据持久化**:游戏可能包含保存和读取进度的功能,这需要使用到Java的文件操作和序列化技术,将游戏状态写入文件,下次启动时再恢复。 6. **多线程**:为了保证游戏流畅性,通常会用到多线程技术。例如,游戏...
6. **IO流**:了解不同类型的流(字节流和字符流)、缓冲流、转换流、对象序列化以及NIO(New IO)框架。 7. **反射**:掌握如何通过反射动态调用方法、创建对象和修改类的属性,以及其在实际应用中的场景。 8. **...