`
schy_hqh
  • 浏览: 558322 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

(IO)对象序列化

 
阅读更多

 

将程序运行过程中的某些对象进行保存(序列化),

在需要的时候再读取(反序列化)出来使用。

写对象:ObjectOutputStream

读对象:ObjectInputStream

要使用序列化功能,必须实现Serializable接口

静态成员和transient修饰的字段,将忽略,不被序列化

 

容易出错的地方:

当未显示声明序列化ID值,而是由程序根据类的各方面信息自动计算,当类发生改变后,计算出来的值就会前后不一致,导致异常发生:

Exception in thread "main" java.io.InvalidClassException: com.gc.stream.Person; local class incompatible: stream classdesc serialVersionUID = -5575955724459671672, local class serialVersionUID = -2912268919946746231

如,写的时候,Person的name属性是private的,使用ObjectOutputStream将对象写到了磁盘上;

写好了之后,由于某些原因,对Person类进行了改变,name属性变为public了;

当使用ObjectInputStream进行反序列化时,发现前后的序列化ID不同,于是出现问题!

 

解决办法:

实现Serializable接口的同时,显示声明serialVersionUID值,保存序列化ID前后一致!即时类的信息发生了改变,但是其serialVersionUID值是不变的!

这样,即时是写好对象后,删除了person的name属性,一样能够正确反序列对象。

 

Person类

package com.gc.stream;

import java.io.Serializable;

public class Person implements Serializable {
	/**
	 * serialVersionUID 确保反序列化不因为类的属性发生修改而抛异常:java.io.InvalidClassException
	 */
	private static final long serialVersionUID = -5575955724459671672L;//根据类名,字段类型,修饰符等信息计算出来的一个long类型值,每个类都唯一,不会重复
	
	public String name;
	private int age;
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
	
	
}

 

package com.gc.stream;

import java.io.EOFException;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;

/**
 * 将对象由堆内存存储到硬盘上---延长对象的声明周期
 *
 */
public class ObjectPersistDemo {
	public static void main(String[] args) throws IOException, ClassNotFoundException {
		//保存对象到磁盘---对象的序列化
		writerObjToDisk();
		
		//从磁盘文件恢复对象---对象的反序列化
		readObjFromDisk();
	}

	private static void writerObjToDisk() throws IOException {
		
		Person p1 = new Person("张晓玲",23);
		Person p2 = new Person("李四",24);
		
		OutputStream out = new FileOutputStream("temp\\person.object");
		
		ObjectOutputStream oos = new ObjectOutputStream(out);
			
		oos.writeObject(p1);
		oos.writeObject(p2);
		
		oos.close();
	}

	private static void readObjFromDisk() throws IOException, ClassNotFoundException {
		
		InputStream in = new FileInputStream("temp\\person.object");
		
		ObjectInputStream ois = new ObjectInputStream(in);
		
		try {
			while(true) {
				//再次调用readObject()时,将读取下一个对象
				Person p = (Person)ois.readObject();
				System.out.println(p.getName()+","+p.getAge());
			}
		} catch(EOFException e) {
			System.out.println("对象读取完毕");
		} finally {
			ois.close();
		}
	}

}
 
分享到:
评论

相关推荐

    C#对象序列化与反序列化

    ### C#对象序列化与反序列化 #### 1. 对象序列化的介绍 ##### (1).NET支持对象序列化的几种方式 .NET框架提供了多种序列化机制,它们各自有不同的应用场景和特点。 - **二进制序列化**: - **定义**:二进制...

    java 对象的序列化与反序列化

    Java对象的序列化和反序列化是Java编程中一项重要的技术,主要用于将对象的状态转换为字节流,以便存储或在网络上传输。这一过程对于理解Java的IO操作、持久化数据以及实现分布式通信等场景非常关键。 首先,我们来...

    C#对象序列化反序列化保存与读取和对象直接保存与读取

    本主题将深入探讨如何在Windows Forms(WF)环境中,利用C#语言进行对象的直接保存与读取,以及通过对象序列化和反序列化的方式实现对象的保存与恢复。 首先,我们来理解什么是对象的直接保存与读取。在C#中,可以...

    java对象序列化和反序列化

    Java对象序列化与反序列化是Java编程中重要的概念,主要应用于数据持久化、网络传输以及存储等场景。本文将详细解析这两个概念及其在实际应用中的实现方式。 **一、Java对象序列化** 1. **定义**: Java对象序列化...

    关于 Java 对象序列化您不知道的 5 件事

    Java对象序列化是Java平台的一项重要特性,它允许将对象的状态转换为字节流,以便存储、传输或恢复。在本文中,我们将深入探讨关于Java对象序列化你可能不知道的五件事情,这些知识点对于理解和优化你的Java应用程序...

    java对象序列化 传输 保存

    Java对象序列化是一种将Java对象转换为字节流的过程,以便可以存储这些对象或通过网络进行传输。这个过程是Java平台的核心特性,它允许开发者将复杂的对象结构持久化或者在网络间进行安全通信。序列化不仅可以用于...

    java对象序列化.ppt

    Java对象序列化是一种将对象转换为字节流的过程,以便可以将其存储在磁盘上,或者在网络中进行传输。这是Java平台提供的一种功能,允许程序员将任何Java对象持久化,即将其状态保存到磁盘,或者在网络中进行传输。...

    java基础 对象序列化

    ### Java基础:对象序列化深度解析 #### 序列化概述与目标 对象序列化是Java编程语言中的一项核心功能,旨在将对象的状态转换为字节流,以便于存储或在网络上传输。这一过程通常涉及将对象转换为二进制格式,以便...

    c#对象序列化和反序列化,压缩流

    在C#编程中,对象序列化和反序列化是至关重要的技术,它们允许我们将对象的状态转化为可存储或可传输的数据格式,例如XML、JSON或二进制,以便于保存、恢复或者在网络间传递。而“压缩流”则涉及到数据的压缩和解...

    C#对象序列化 源代码

    在.NET框架中,C#对象序列化是一种将对象的状态转换为可存储或可传输的数据格式的过程。这在很多场景下非常有用,例如保存用户会话、传输数据到远程服务器或者持久化对象到数据库。对象序列化的概念是核心的编程概念...

    介绍Java对象序列化使用基础

    序列化的过程就是对象写入字节流和从字节流中读取对象。...对象序列化功能非常简单、强大,在RMI、Socket、JMS、EJB都有应用。对象序列化问题在网络编程中并不是最激动人心的课题,但却相当重要,具有许多实用意义。

    JAVA对象的序列化与反序列化详细PPT课件.pptx

    前者代表对象输出流,具备`writeObject(Object obj)`方法,可以将对象序列化并写入到目标输出流;后者代表对象输入流,其`readObject()`方法能从输入流中读取字节流并反序列化为对象。 为了使一个Java对象能够被...

    Java对象的序列化和反序列化实践

    3. **实现**:在Java中,一个类如果想要实现序列化,需要实现`java.io.Serializable`接口。这个接口是一个标记接口,没有方法定义,只是表明该类的对象可以被序列化。 4. **序列化API**:主要包括`...

    IO流与序列化

    在Java编程语言中,`IO流`(Input/Output Stream)和`序列化`是两个重要的概念,它们在处理数据传输、持久化存储以及对象状态的保存等方面发挥着关键作用。 **IO流**: IO流是Java提供的用于处理输入输出操作的机制...

    Java对象序列化的秘密

    在Java中,实现对象序列化主要依靠实现`java.io.Serializable`接口。本文将深入探讨Java对象序列化的原理、用途和注意事项。 **一、序列化原理** 1. **实现Serializable接口**: 对象要能够被序列化,它所在的类...

    流程控制 网络编程 对象序列化

    对象序列化、网络编程、线程和IO流是Java中极为重要的概念和技术点,它们分别解决了数据的持久化、网络传输、并发执行和输入输出的问题。掌握这些技术,不仅能够提升开发效率,还能构建出更稳定、高效的应用系统。

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

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

    通过socket传递java对象(对象序列化)

    本篇将深入探讨如何通过Socket传递Java对象,重点讲解对象序列化的过程。 首先,让我们理解什么是Socket。Socket在计算机网络中是一种进程间通信机制,它允许两个网络应用程序之间建立连接并交换数据。在Java中,`...

    C#序列化与反序列化(包括复杂xml对象)

    在C#编程中,序列化和反序列化是两个关键的概念,它们主要用于对象状态的持久化和恢复。本文将深入探讨C#中的XML序列化和反序列化技术,包括如何将XML文档解析为对象,以及如何将对象转换回XML文档进行存储。我们将...

    对象的序列化和反序列化

    在Java中,如果一个类需要支持序列化,那么这个类就需要实现`java.io.Serializable`接口。这是一个标记接口,没有包含任何方法,它仅仅表示该类的对象可以被序列化。当一个对象实例化后,如果其类实现了`...

Global site tag (gtag.js) - Google Analytics