`

I/O 5:序列化

    博客分类:
  • I/O
 
阅读更多

 

一个类如想被序列化,是需要实现java.io.Seralizable接口,该接口中没有定义任何方法,是一个标识性接口(Marker Interface),当一个类实现了该接口,就表示这个类的对象是可以序列化的。

transient这个关键字只用在序列化中,将引用的对象标识为transient,则此对象不会被序列化。如下

private transient User ....

 

在序列化时,static变量是无法被序列化的;如果A包含了对B的引用,那么在序列化A时也会将B一并地序列化;如果此时A可以序列化,B无法序列化,那么当序列化A的时候就会发生异常。这时就需要将对B的引用设为transient。该关键字表示变量不会被序列化。

 

package com.test.io;

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 SerializableTest {
	public static void main(String[] args) throws IOException, ClassNotFoundException {
		//序列化
		Person p1 = new Person(21,"zhangsan",1.61);
		Person p2 = new Person(23,"lisi",1.75);
		Person p3 = new Person(22,"hp",1.70);
		FileOutputStream fos = new FileOutputStream("person.txt");
		ObjectOutputStream oos = new ObjectOutputStream(fos);
		oos.writeObject(p1);
		oos.writeObject(p2);
		oos.writeObject(p3);
		oos.close(); //只需要关闭最外层
		
		System.out.println("--------------");
		//反序列化
		FileInputStream fis = new FileInputStream("person.txt");
		ObjectInputStream ois = new ObjectInputStream(fis);
		Person p = null;
		for (int i = 0; i < 3; i++) {
			p = (Person) ois.readObject();
			System.out.println("name ="+p.name+" age = "+p.age+" height = "+p.height);
		}
		ois.close();
	}
}

class Person implements Serializable{
	int age;
	transient String name;  //transient定义的变量不会被序列化
	double height;
	public Person(int age,String name,double height) {
		this.age = age;
		this.name = name;
		this.height = height;
	}
}

 打印结果为

由于name是transient的,所以不会被序列化。

 

实现上述两个方法后,序列化与反序列化则完成类自身来控制。

 

package com.test.io;

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 SerializableTest2 {
	public static void main(String[] args) throws IOException, ClassNotFoundException {
		//序列化
		Person2 p1 = new Person2(21,"zhangsan",1.61);
		Person2 p2 = new Person2(23,"lisi",1.75);
		Person2 p3 = new Person2(22,"hp",1.70);
		FileOutputStream fos = new FileOutputStream("Person2.txt");
		ObjectOutputStream oos = new ObjectOutputStream(fos);
		oos.writeObject(p1);
		oos.writeObject(p2);
		oos.writeObject(p3);
		oos.close(); //只需要关闭最外层
		
		System.out.println("--------------");
		//反序列化
		FileInputStream fis = new FileInputStream("Person2.txt");
		ObjectInputStream ois = new ObjectInputStream(fis);
		Person2 p = null;
		for (int i = 0; i < 3; i++) {
			p = (Person2) ois.readObject();
			System.out.println("name ="+p.name+" age = "+p.age+" height = "+p.height);
		}
		ois.close();
	}
}

class Person2 implements Serializable{
	int age;
	transient String name;  //transient定义的变量不会被序列化
	double height;
	public Person2(int age,String name,double height) {
		this.age = age;
		this.name = name;
		this.height = height;
	}
	private void writeObject(ObjectOutputStream oos) throws IOException{
		System.out.println("write object");
		oos.writeInt(this.age);
		oos.writeUTF(this.name);
	}
	private void readObject(ObjectInputStream ois) throws IOException{
		System.out.println("read object");
		this.age = ois.readInt();
		this.name = ois.readUTF();
	}
	
}

 当我们在一个待序列化/反序列化的类中实现了上面两个private方法(方法声明要与上面的保持一致),那么就允许我们以更加底层,更加细粒度的方式序列化/反序列化的过程。

分享到:
评论

相关推荐

    Java I/O, 2nd Edition

    通过《Java I/O, 2nd Edition》这本著作,读者将能够深入理解Java的I/O系统,掌握高效、安全的I/O编程技巧,无论是处理文件、网络通信还是序列化,都能游刃有余。对于Java开发者来说,这是一本不可多得的参考资料。

    DAQ十讲:模拟I/O与数字I/O.zip

    在本资源包“DAQ十讲:模拟I/O与数字I/O.zip”中,重点涵盖了使用NI(National Instruments)数据采集(DAQ)设备进行模拟输入/输出(Analog Input/Output, A/D and D/A)以及数字输入/输出(Digital Input/Output, ...

    深入分析 Java I/O 的工作机制(转载)

    ObjectInputStream和ObjectOutputStream负责对象的序列化和反序列化操作。 7. **NIO(非阻塞I/O)** Java 1.4引入了NIO(New I/O)框架,提供了一种更有效率的I/O模型,特别是在多路复用I/O(Selector)方面。NIO...

    Visual C++中对象的序列化与文件I/O研究

    在Visual C++中,对象的序列化与文件I/O是程序持久性和数据记录的重要技术。对象序列化的目的是保存和加载对象的状态数据,使得程序能够在终止后再恢复到之前的状态。这一过程在MFC(Microsoft Foundation Classes)...

    74LS273扩展I/O口实验

    1. **编写汇编程序**:设定初始化序列,配置I/O端口地址,以及编写循环结构以控制LED灯的顺序闪烁。 2. **74LS273配置**:确定LE信号的时序,确保在正确的时间点锁存数据到输出端。 3. **Proteus仿真**:构建电路...

    Java I/O层次结构详解

    - **ObjectInputStream和ObjectOutputStream**:支持Java对象的序列化和反序列化,使对象能保存到磁盘或在网络间传输。 7. **内存I/O** - **ByteArrayInputStream和ByteArrayOutputStream**:在内存中读写字节流...

    Java I/O编程 java

    `ObjectInputStream`和`ObjectOutputStream`用于序列化和反序列化Java对象,使对象可以保存到文件或在网络上传输。对象流继承自字节流,因此可以处理非原始数据类型。 8. 数据流小结: 在Java I/O编程中,理解不同...

    java基础之I/O流

    Java提供了ObjectInputStream和ObjectOutputStream,用于序列化和反序列化对象,实现对象的持久化存储或网络传输。 5. 转换流(Wrapper Streams): InputStreamReader和OutputStreamWriter将字节流转换为字符流...

    korio,Korio:Kotlin Coroutines I/O:流+异步TCP客户机/服务器+WebSockets+异步注入器+异步路由器+虚拟文件系统+序列化(XML/JSON/yaml)+Redis+Cassandra+ElasticSearch+Amazon Dynamodb&S3;+OAuth(Google&Facebook;),适用于JVM、Android、node.js和浏览器.zip

    它提供了一系列高级功能,包括异步 TCP 客户端/服务器、WebSockets 支持、异步注入器、异步路由器、虚拟文件系统、序列化工具以及对各种数据库和云服务的集成。Korio 可以在 JVM、Android、Node.js 和浏览器环境中...

    Java I/O流通讯录

    学习这个项目可以深入理解Java I/O流的使用,包括文件操作、数据序列化、文本处理等方面。通过实践,还可以了解到如何处理异常、如何进行文件操作的错误检查等实际开发中的技巧。这个通讯录应用为初学者提供了一个很...

    Vbs序列化/反序列化Json基类

    Vbs序列化/反序列化Json基类 可直接使用,bug已被我修复 Example: Dim fso, json, str, o, i Set json = New VbsJson Set fso = WScript.CreateObject("Scripting.Filesystemobject") str = fso.OpenTextFile&#40;...

    java中I/O的t经典ppt

    - Java提供了ObjectOutputStream和ObjectInputStream,可以将Java对象转换为字节流(序列化),并从字节流中恢复对象(反序列化)。 9. **转换流**: - InputStreamReader和OutputStreamWriter是字符流和字节流...

    Java I/O系统

    除了基本的读写操作,Java I/O还提供了对象序列化和反序列化的功能。`ObjectOutputStream`和`ObjectInputStream`可以将Java对象转换为字节流并存储到磁盘或网络中,反之亦然。这对于持久化数据和远程通信非常有用。 ...

    飞思卡尔单片机I/O口及程序框架

    初始化序列包括配置I/O口、时钟系统、定时器、串口等硬件资源。事件处理循环则根据系统需求,处理中断请求、定时任务或其他用户事件。 3. 中断服务程序:中断服务程序是处理外部事件或内部定时器触发的特殊程序。当...

    Java输入与输出(I、O).

    Java输入与输出(I/O)是Java编程语言中不可或缺的一部分,它允许程序与外部资源进行数据交换,如文件系统、网络、硬件设备等。在Java中,I/O操作被封装在许多类和接口中,形成了丰富的API。以下将详细介绍几个重要...

    java i/0习题

    通过解决这些练习题,你将能够熟练运用Java I/O进行各种实际操作,如文件读写、网络通信、数据序列化等。在学习过程中,不断实践和总结,理解不同流类的特性和适用场景,是提升Java I/O技能的关键。

    IT8718F I/O Datasheet

    IT8718F作为一款高性能的主板I/O芯片,在设计上充分考虑了现代电子产品的多样化需求,尤其是在低引脚数量方面的优秀表现,使其成为众多高端主板的理想选择。此外,通过详细的文档支持和技术服务,用户可以轻松地将该...

    IOCP服务交互源码-易语言.zip

    源码可能还包含对不同类型的网络协议(如TCP/IP、UDP等)的支持,以及数据的序列化和反序列化等细节。 学习和分析这个源码,不仅可以深入理解易语言的编程方式,还可以提升对Windows异步I/O机制的理解,这对于开发...

    图形的序列化MFC源代码

    在IT领域,序列化是一个重要的概念...5. 文件I/O操作,通过`CFile`类进行文件的读写。 这个项目不仅涉及编程技术,还涉及到软件设计原则,如数据结构选择和持久化策略,对初学者和有经验的开发者都有很高的学习价值。

    Visual C++中对象的序列化与文件I-O研究.rar_c++对象序列化_对象序列化_序列化

    在Visual C++环境下,我们可以使用标准库中的流I/O(IOStream)或者自定义的序列化机制来实现这一目标。 一、C++对象序列化的基础 对象序列化的目标是将对象的状态转换成字节流,以便保存到磁盘或者网络上。这通常...

Global site tag (gtag.js) - Google Analytics