一个类如想被序列化,是需要实现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系统,掌握高效、安全的I/O编程技巧,无论是处理文件、网络通信还是序列化,都能游刃有余。对于Java开发者来说,这是一本不可多得的参考资料。
在本资源包“DAQ十讲:模拟I/O与数字I/O.zip”中,重点涵盖了使用NI(National Instruments)数据采集(DAQ)设备进行模拟输入/输出(Analog Input/Output, A/D and D/A)以及数字输入/输出(Digital Input/Output, ...
ObjectInputStream和ObjectOutputStream负责对象的序列化和反序列化操作。 7. **NIO(非阻塞I/O)** Java 1.4引入了NIO(New I/O)框架,提供了一种更有效率的I/O模型,特别是在多路复用I/O(Selector)方面。NIO...
在Visual C++中,对象的序列化与文件I/O是程序持久性和数据记录的重要技术。对象序列化的目的是保存和加载对象的状态数据,使得程序能够在终止后再恢复到之前的状态。这一过程在MFC(Microsoft Foundation Classes)...
1. **编写汇编程序**:设定初始化序列,配置I/O端口地址,以及编写循环结构以控制LED灯的顺序闪烁。 2. **74LS273配置**:确定LE信号的时序,确保在正确的时间点锁存数据到输出端。 3. **Proteus仿真**:构建电路...
- **ObjectInputStream和ObjectOutputStream**:支持Java对象的序列化和反序列化,使对象能保存到磁盘或在网络间传输。 7. **内存I/O** - **ByteArrayInputStream和ByteArrayOutputStream**:在内存中读写字节流...
`ObjectInputStream`和`ObjectOutputStream`用于序列化和反序列化Java对象,使对象可以保存到文件或在网络上传输。对象流继承自字节流,因此可以处理非原始数据类型。 8. 数据流小结: 在Java I/O编程中,理解不同...
Java提供了ObjectInputStream和ObjectOutputStream,用于序列化和反序列化对象,实现对象的持久化存储或网络传输。 5. 转换流(Wrapper Streams): InputStreamReader和OutputStreamWriter将字节流转换为字符流...
它提供了一系列高级功能,包括异步 TCP 客户端/服务器、WebSockets 支持、异步注入器、异步路由器、虚拟文件系统、序列化工具以及对各种数据库和云服务的集成。Korio 可以在 JVM、Android、Node.js 和浏览器环境中...
学习这个项目可以深入理解Java I/O流的使用,包括文件操作、数据序列化、文本处理等方面。通过实践,还可以了解到如何处理异常、如何进行文件操作的错误检查等实际开发中的技巧。这个通讯录应用为初学者提供了一个很...
Vbs序列化/反序列化Json基类 可直接使用,bug已被我修复 Example: Dim fso, json, str, o, i Set json = New VbsJson Set fso = WScript.CreateObject("Scripting.Filesystemobject") str = fso.OpenTextFile(...
- Java提供了ObjectOutputStream和ObjectInputStream,可以将Java对象转换为字节流(序列化),并从字节流中恢复对象(反序列化)。 9. **转换流**: - InputStreamReader和OutputStreamWriter是字符流和字节流...
除了基本的读写操作,Java I/O还提供了对象序列化和反序列化的功能。`ObjectOutputStream`和`ObjectInputStream`可以将Java对象转换为字节流并存储到磁盘或网络中,反之亦然。这对于持久化数据和远程通信非常有用。 ...
初始化序列包括配置I/O口、时钟系统、定时器、串口等硬件资源。事件处理循环则根据系统需求,处理中断请求、定时任务或其他用户事件。 3. 中断服务程序:中断服务程序是处理外部事件或内部定时器触发的特殊程序。当...
Java输入与输出(I/O)是Java编程语言中不可或缺的一部分,它允许程序与外部资源进行数据交换,如文件系统、网络、硬件设备等。在Java中,I/O操作被封装在许多类和接口中,形成了丰富的API。以下将详细介绍几个重要...
通过解决这些练习题,你将能够熟练运用Java I/O进行各种实际操作,如文件读写、网络通信、数据序列化等。在学习过程中,不断实践和总结,理解不同流类的特性和适用场景,是提升Java I/O技能的关键。
IT8718F作为一款高性能的主板I/O芯片,在设计上充分考虑了现代电子产品的多样化需求,尤其是在低引脚数量方面的优秀表现,使其成为众多高端主板的理想选择。此外,通过详细的文档支持和技术服务,用户可以轻松地将该...
源码可能还包含对不同类型的网络协议(如TCP/IP、UDP等)的支持,以及数据的序列化和反序列化等细节。 学习和分析这个源码,不仅可以深入理解易语言的编程方式,还可以提升对Windows异步I/O机制的理解,这对于开发...
在IT领域,序列化是一个重要的概念...5. 文件I/O操作,通过`CFile`类进行文件的读写。 这个项目不仅涉及编程技术,还涉及到软件设计原则,如数据结构选择和持久化策略,对初学者和有经验的开发者都有很高的学习价值。
在Visual C++环境下,我们可以使用标准库中的流I/O(IOStream)或者自定义的序列化机制来实现这一目标。 一、C++对象序列化的基础 对象序列化的目标是将对象的状态转换成字节流,以便保存到磁盘或者网络上。这通常...