将程序运行过程中的某些对象进行保存(序列化),
在需要的时候再读取(反序列化)出来使用。
写对象: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(); } } }
相关推荐
序列化的过程就是对象写入字节流和从字节流中读取对象。...对象序列化功能非常简单、强大,在RMI、Socket、JMS、EJB都有应用。对象序列化问题在网络编程中并不是最激动人心的课题,但却相当重要,具有许多实用意义。
把Java对象转换为字节序列的过程称为对象的序列化。 把字节序列恢复为Java对象的过程称为对象的反序列化。 对象的序列化主要有两种用途: 1)把对象的字节序列地保存到硬盘上,通常存放在一个文件中...
54-IO流(对象的序列化).avi
主要介绍了java IO数据操作流、对象序列化、压缩流代码解析,具有一定借鉴价值,需要的朋友可以参考下
主要介绍了Java IO流对象的序列化和反序列化实例详解的相关资料,需要的朋友可以参考下
Java序列化(java.io.Serializable) Hadoop序列化的特点 Hadoop的序列化格式:Writable 序列化格式特点: 紧凑:高效使用存储空间。 快速:读写数据的额外开销小 可扩展:可透明地读取老格式...
为什么实现了java.io.Serializable接口才能被序列化 transient的作用是什么 怎么自定义序列化策略 自定义的序列化策略是如何被调用的 ArrayList对序列化的实现有什么好处 Java对象的序列化 ...
序列化:将对象写入IO流中; 反序列化:从IO流中恢复对象; 意义:序列化机制允许将实现序列化的Java对象转换为字节序列,并将字节序列保存在磁盘中,或通过网络传输,以达到以后恢复成原来的对象。序列化机制使地...
对象序列化是Java编程中的必备武器 Java高级程序设计实战教程第五章-Java序列化机制全文共15页,当前为第4页。 5.2.2 序列化应用 当你想把内存中的对象状态保存到一个文件中或者数据库中时候; 当你想用套接字在...
java 网络编程 流程控制 线程
本文实例讲述了C#实现对象XML序列化的方法。分享给大家供大家参考。具体实现方法如下: 代码如下:using system;... /// 对象序列化成 xml string /// public static string xmlserialize(t obj) { strin
内容概要:以上列出的Java面试题涵盖了Java语言的基础知识、面向对象编程、集合、IO流、多线程、反射、类加载器、JVM、序列化、泛型、异常处理、注解等多个方面。 适用人群:以上Java面试题适用于准备Java开发...
IO实现本地序列化和反序列化,面向对象,集合等
一般而言,要使得一个类可以序列化,只需简单实现java.io.Serializable接口即可(还要实现无参数的构造方法)。该接口是一个标记式接口,它本身不包含任何内容,实现了该接口则表示这个类准备支持序列化的功能。...
被传递的对象需要先实现序列化,而序列化对象有两种方式:java.io.Serializable和android.os.Parcelable Java中使用的是Serializable,而谷歌在Android使用了自定义的Parcelable。 两种序列化方式的区别: 1.在...
一、序列化 实现序列化:extends ... 所以,在节点传输对象的时候,就需要将所传输的对象进行序列化 所以会发生这样的场景:当一个对象从Driver端传输到Executor端的时候就需要进行序列化 通过实例总结:
本文实例讲述了C#实现XML与实体类之间相互转换的方法。分享给大家供大家参考,具体如下: using System; using System.Collections.Generic.../// Xml序列化与反序列化 /// public class XmlUtil { #region 反序列化
把“对象”转换为“字节序列”的过程称为对象的序列化。 把“字节序列”恢复为“对象”的过程称为对象的反序列化。 序列化 代码如下:using System; using System.Collections.Generic; using System.Linq; ...
postgis-geojson 用于PostGIS Geometry对象的GeoJSON Jackson序列化器和反序列化器。GeoJSON支持该库支持对GeoJSON规范中定义的所有序列化/反序列化。 下面给出了GeoJSON几何对象与PostGIS对象之间的关系: GeoJSON ...
实例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....