`
schy_hqh
  • 浏览: 542556 次
  • 性别: 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();
		}
	}

}
 
分享到:
评论

相关推荐

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

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

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

     把Java对象转换为字节序列的过程称为对象的序列化。  把字节序列恢复为Java对象的过程称为对象的反序列化。  对象的序列化主要有两种用途:  1)把对象的字节序列地保存到硬盘上,通常存放在一个文件中...

    54-IO流(对象的序列化).avi

    54-IO流(对象的序列化).avi

    java IO数据操作流、对象序列化、压缩流代码解析

    主要介绍了java IO数据操作流、对象序列化、压缩流代码解析,具有一定借鉴价值,需要的朋友可以参考下

    Java IO流对象的序列化和反序列化实例详解

    主要介绍了Java IO流对象的序列化和反序列化实例详解的相关资料,需要的朋友可以参考下

    java-Hadoop序列化

     Java序列化(java.io.Serializable)  Hadoop序列化的特点  Hadoop的序列化格式:Writable  序列化格式特点:  紧凑:高效使用存储空间。  快速:读写数据的额外开销小  可扩展:可透明地读取老格式...

    深入分析Java的序列化与反序列化

     为什么实现了java.io.Serializable接口才能被序列化  transient的作用是什么  怎么自定义序列化策略  自定义的序列化策略是如何被调用的  ArrayList对序列化的实现有什么好处  Java对象的序列化  ...

    java序列化和反序列化,面试必备

    序列化:将对象写入IO流中; 反序列化:从IO流中恢复对象; 意义:序列化机制允许将实现序列化的Java对象转换为字节序列,并将字节序列保存在磁盘中,或通过网络传输,以达到以后恢复成原来的对象。序列化机制使地...

    Java高级程序设计实战教程第五章-Java序列化机制.pptx

    对象序列化是Java编程中的必备武器 Java高级程序设计实战教程第五章-Java序列化机制全文共15页,当前为第4页。 5.2.2 序列化应用 当你想把内存中的对象状态保存到一个文件中或者数据库中时候; 当你想用套接字在...

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

    java 网络编程 流程控制 线程

    C#实现对象XML序列化的方法

    本文实例讲述了C#实现对象XML序列化的方法。分享给大家供大家参考。具体实现方法如下: 代码如下:using system;... /// 对象序列化成 xml string  ///  public static string xmlserialize(t obj)  {  strin

    Java工程师必备面试题【多线程、反射、类加载器、JVM、泛型、异常处理、注解、面向对象编程、集合、IO流、序列化】

    内容概要:以上列出的Java面试题涵盖了Java语言的基础知识、面向对象编程、集合、IO流、多线程、反射、类加载器、JVM、序列化、泛型、异常处理、注解等多个方面。 适用人群:以上Java面试题适用于准备Java开发...

    java小项目练习IO实现

    IO实现本地序列化和反序列化,面向对象,集合等

    Java序列化与反序列化三种格式存取

     一般而言,要使得一个类可以序列化,只需简单实现java.io.Serializable接口即可(还要实现无参数的构造方法)。该接口是一个标记式接口,它本身不包含任何内容,实现了该接口则表示这个类准备支持序列化的功能。...

    Android 通过Intent使用Bundle传递对象详细介绍

    被传递的对象需要先实现序列化,而序列化对象有两种方式:java.io.Serializable和android.os.Parcelable Java中使用的是Serializable,而谷歌在Android使用了自定义的Parcelable。 两种序列化方式的区别: 1.在...

    Spark基础知识03——序列化

    一、序列化 实现序列化:extends ... 所以,在节点传输对象的时候,就需要将所传输的对象进行序列化  所以会发生这样的场景:当一个对象从Driver端传输到Executor端的时候就需要进行序列化    通过实例总结:  

    C#实现XML与实体类之间相互转换的方法(序列化与反序列化)

    本文实例讲述了C#实现XML与实体类之间相互转换的方法。分享给大家供大家参考,具体如下: using System; using System.Collections.Generic.../// Xml序列化与反序列化 /// public class XmlUtil { #region 反序列化

    C#序列化与反序列化实例

    把“对象”转换为“字节序列”的过程称为对象的序列化。 把“字节序列”恢复为“对象”的过程称为对象的反序列化。 序列化 代码如下:using System;  using System.Collections.Generic;  using System.Linq;  ...

    postgis-geojson:用于PostGIS Geometry对象的GeoJSON Jackson序列化器和反序列化器

    postgis-geojson 用于PostGIS Geometry对象的GeoJSON Jackson序列化器和反序列化器。GeoJSON支持该库支持对GeoJSON规范中定义的所有序列化/反序列化。 下面给出了GeoJSON几何对象与PostGIS对象之间的关系: GeoJSON ...

    java中的IO操作总结(四)

    实例1:对象的序列化 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 import java.io.File; import java....

Global site tag (gtag.js) - Google Analytics