`

序列化和文件的输入输出

OS 
阅读更多
//序列化
FileOutputStream fileStream = new FileOutputStream("MyGame.ser");
ObjectOutputStream os = new ObjectOutputStream(fileStream);
os.writeObject(characterOne);//将变量所引用的对象序列化并写入MyGame.ser这个文件,且characterOne所属的类必须继承Serializable接口(此接口没有方法需要实现,标记用接口)
os.writeObject(characterTwo);//另一个对象
os.close();


一般来说,串流要两两连接才能做出有意义的事情——其中一个表示连接,另一个则是调用方法的。为何要两个?因为连接的串流通常都是很底层的。以FileOutputStream为例,它有可以写入字节的方法。但我们通常不会直接写入字节,而是以对象层次的观点来写入,所以需要高层的连接流串。这是考虑到良好的面向对象设计,每个类只要做好一件事。这样还可以通过不同的串流组合来达到最大的适应性。

当对象被序列化时,被该对象引用的实例变量也会被序列化。且所有被引用的对象也会被序列化。这些操作都是自动进行的。

整个对象版图都必须正确的序列化,不然就得全部失败。比如某个对象A继承了Serializable接口,但是他有一个成员变量是其他对象B(该对象不能被序列化)的引用,那么A将不能被序列化。
如果你需要序列化程序能够跳过某个实例变量,就把它标记成transient的变量。(比如该变量必须当场创建才有意义,或者没有实现Serializable)。这个变量还是有的,只是给序列化程序的值为null。

序列化聪明得足以分辨两个对象是否相同,在此情况下只有一个对象会被存储。

//解序列化
FileInputStream fileStream = new FileInputStream("MyGame.ser");
ObjectInputStream os = new ObjectInputStream(fileStream);
Object one = os.readObject();
Object two = os.readObject();//每次调用readObject()都会从Stream中读出下一个对象,与写入顺序相同
GameCharacter elf = (GameCharacter )one;//转换对象类型
GameCharacter troll = (GameCharacter )two;
os.close();//FileInputStream会自动跟着关掉


解序列化时transient的变量是null或者是primitive主数据类型的默认值。构造函数不会执行,因为一旦执行对象的状态又变成全新的了,这不是解序列化想要的结果。
如果对象在继承树上有个不可序列化的祖先类,则该不可序列化类以及在它之上的类的构造函数(就算是可序列化也一样)就会执行。

静态变量不会被序列化,因为它不是“每个对象一个”。

对象的序列化可能会存储一些基本的类的信息(比如类名,能保证在解序列化时能找到类),其他的大部分关于类的信息都不会存储,需要时去找内存中类的定义。----自己想的

读文件的时候文件不存在不会创建,写文件时若不存在则会创建

对象被序列化的同时,该对象会被盖上一个类的版本识别ID(serialVersionUID)。如果想在类变动后还能成功还原被序列化了的对象,就要把当初的serialVersionUID放在class中,让类在演化的过程中保持相同ID。但是前提是你得要对带回旧对象的任何问题负起全责。
分享到:
评论

相关推荐

    XML序列化与反序列化 实战

    这使得XML序列化和反序列化变得简单,因为编译后的类可以直接与XML文件进行转换,无需手动编写解析和构造对象的代码。 在实际应用中,XML序列化和反序列化有多种用途,例如: 1. 存储和加载应用程序设置:用户配置...

    输入输出流和文件操作

    Java程序设计中的输入输出流和文件操作是编程中不可或缺的部分,它们允许程序与外部世界进行数据交换,包括读取文件内容、写入数据到文件、以及处理标准输入输出。以下是对这些概念的详细阐述: 1. **文件和流的...

    Java文件输入输出汇总

    Java文件输入输出是Java编程中的基础且重要的一部分,它涵盖了数据在文件系统和程序之间的传输。这个主题包括了多种类和方法,使得开发者能够高效地处理文件内容。本文将深入探讨Java中的文件输入输出机制,以及如何...

    io_输入输出流_序列化反序列化_04.zip

    我们将通过标题"io_输入输出流_序列化反序列化_04.zip"中的内容,详细解析这些关键知识点。 首先,让我们从IO流的基本概念开始。在Java中,IO流被分为两类:字节流和字符流。字节流处理的是8位的字节数据,适用于...

    java序列化和反序列化

    - 实现此接口后,Java虚拟机就能够自动进行序列化和反序列化操作。 2. **序列化过程:** - 创建一个`java.io.ObjectOutputStream`实例。 - 使用`ObjectOutputStream`的`writeObject()`方法将对象写出到输出流中...

    VB.NET XML和JSON序列化与反序列化

    在VB.NET编程环境中,XML和JSON序列化与反序列化是常见的数据处理技术,用于将对象转换为文本格式(XML或JSON),以便于存储、传输和解析。这两者都是轻量级的数据交换格式,广泛应用于Web服务和客户端应用程序之间...

    VC序列化-存储文件方法

    `CObject`提供了一个`Serialize`函数,它接受一个`CArchive`对象,`CArchive`是MFC封装的`IStream`和`OStream`,可以实现对象到文件的输入/输出。 3. **如何实现序列化**:首先,你需要在自定义类中声明`Serialize`...

    基于对象输入输出流和数据结构的图书管理系统

    《基于对象输入输出流和数据结构的图书管理系统》是一个使用JAVA编程语言开发的DOS版本图书管理系统。这个系统充分利用了JAVA中的对象输入输出流技术以及高效的数据结构,以实现对图书信息的有效管理和操作。 首先...

    MFC序列化资料文档 序列化资料

    5. **CArchive类**:MFC提供的一个类,用于处理序列化过程中的数据输入输出。`CArchive`对象可以与文件或内存流关联,从而实现对象的序列化和反序列化。 6. **打开和关闭档案**:在序列化之前,你需要创建一个`...

    JAVA对象序列化保存为XML文件的工具类

    【JAVA对象序列化保存为XML文件的工具类】 在Java编程中,对象序列化是一种将对象的状态转换为字节流的过程,以便可以存储或在网络上传输。而在反序列化时,这个字节流又可以恢复为原来的对象。Java提供了一个方便...

    java i/o包流式输入输出和文件操作

    Java I/O 包是Java平台的核心部分,它提供了丰富的类和接口用于处理输入输出操作,包括文件操作和流式输入输出。在这个主题中,我们将深入探讨如何使用Java进行文件管理和流处理。 首先,我们来看看`java.io`包中的...

    C#简单流程图代码

    该程序的核心功能包括序列化和文件输入输出。序列化是指将对象的状态转换为可以存储或传输的形式,如XML、JSON或二进制格式。在这个上下文中,序列化可能被用来保存用户创建的流程图,以便在将来打开或继续编辑。...

    java 文件输入输出流 实例代码

    以上就是Java文件输入输出流的基本用法和实例代码,涵盖了字节流、字符流、缓冲流、转换流、对象序列化以及NIO等关键知识点。通过这些技术,开发者能够有效地在程序中进行文件的读取、写入和复制等操作。在实际项目...

    C语言中的文件输入输出

    ### C语言中的文件输入输出 #### 知识点概述 本文将通过分析一段关于C语言文件操作的示例代码,来详细介绍C语言中文件输入输出的基本概念、函数使用方法及其应用场景。 #### 文件输入输出基本概念 在C语言中,...

    Java序列化

    - Java序列化是Java平台提供的一种持久化机制,它允许将对象转换为字节序列,这样就可以保存在文件中或在网络上传输。 - 序列化不仅可以用来持久化数据,还可以用于进程间通信(IPC)和远程方法调用(RMI)。 2. ...

    XML序列化与反序列化整理文档(12套)

    输入XML文档,它会分析元素和属性,并创建相应的类定义,这大大简化了序列化和反序列化的准备工作。 4. **实例代码**: 提供的实例代码可能包含以下部分: - 创建可序列化类的定义,包括必要的属性和标记。 - ...

    LSTM多输入输出时间序列

    通常,它可能包含了源代码、数据集、README文件、模型配置和训练脚本等资源,供开发者研究和复现LSTM在多输入输出时间序列预测上的实现。 总结来说,LSTM多输入输出时间序列预测是一种利用深度学习技术解决复杂预测...

    java基础 对象序列化

    3. **反序列化过程**:使用`java.io.ObjectInputStream`类的`readObject()`方法从输入流中读取对象。 #### 文件序列化实例 文件序列化是一种常见的序列化应用场景,用于将对象状态保存到文件中。这一过程涉及将...

    IO流与序列化

    通过学习IO流与序列化,开发者能够更好地理解Java中数据的读写和对象状态的保存,这对于开发涉及文件操作、网络通信和持久化存储的程序至关重要。同时,熟悉这些技术也有助于提升代码的可维护性和性能。

Global site tag (gtag.js) - Google Analytics