- 浏览: 63489 次
- 性别:
- 来自: 成都
最新评论
-
hanmiao:
博客已经806天不再更新了,长草了都...
Effective Java读书笔试之创建和销毁对象 -
zhengjj_2009:
问你一个小问题,“Java虚拟机通过装载,连接和初始化一个Ja ...
深入JVM读书笔记之类装载+连接+初始化 -
Branding:
对!!!
类的初始化顺序 -
yuyiming1986:
为什么equals()相等的两个对象,hashCode( ...
hashCode()和equals方法 -
fd_zhaoshuo:
①两个obj,如果equals()相等,hashCode()一 ...
hashCode()和equals方法
Java对象序列化
对于一个存在Java虚拟机中的对象来说,其内部的状态只是保存在内存中。JVM退出之后,内存资源也就被释放,Java对象的内部状态也就丢失了。而在很多情况下,对象内部状态是需要被持久化的,将运行中的对象状态保存下来(最直接的方式就是保存到文件系统中),在需要的时候可以还原,即使是在Java虚拟机退出的情况下。
对象序列化机制是Java内建的一种对象持久化方式,可以很容易实现在JVM中的活动对象与字节数组(流)之间进行转换,使用得Java对象可以被存储,可以被网络传输,在网络的一端将对象序列化成字节流,经过网络传输到网络的另一端,可以从字节流重新还原为Java虚拟机中的运行状态中的对象。
1.相关的接口
Java类中对象的序列化工作是通过ObjectOutputStream和ObjectInputStream来完成的。
只能使用readObject()|writeObject()方法对对象进行读写操作。除对象之外,Java中的基本类型和数组也可以被序列化,对于基本类型,可以使用readInt(),writeInt(),
readDouble(),writeDouble()等类似的接口进行读写。
2.Serializable接口
对于任何需要被序列化的对象,都必须要实现接口Serializable,它只是一个标识接口,本身没有任何成员,只是用来标识说明当前的实现类的对象可以被序列化.
3.transient关键字
如果在类中的一些属性,希望在对象序列化过程中不被序列化,使用关键字transient标注修饰就可以.当对象被序列化时,标注为transient的成员属性将会自动跳过。
4.Java序列化中需要注意:
(1).当一个对象被序列化时,只保存对象的非静态成员变量,不能保存任何的成员方法,静态的成员变量和transient标注的成员变量。
(2).如果一个对象的成员变量是一个对象,那么这个对象的数据成员也会被保存还原,而且会是递归的方式。
(3).如果一个可序列化的对象包含对某个不可序列化的对象的引用,那么整个序列化操作将会失败,并且会抛出一个NotSerializableException。可以将这个引用标记transient,那么对象仍然可以序列化。
5.一个综合实例:
将对象写入文件,序列化
从文件中读取对象,反序列化
输出:
[TestWriteObject]
Info:对象被写入C://obj.txt
[TestReadObjec]
Info:文件C://obj.txt中读取对象
Info:文件C://obj.txt中读取对象
Student Object name:king age:0
Course Object courseName:null credit:3
Student Object name:jason age:0
Course Object courseName:null credit:4
123
可知Person中的age属性被标注为transient后,在序列化对象时,age属性就没有被序列化了; Course中的name属性被static后,Course的name静态属性就没有被序列化;虽然是序列化Person对象,但是Person所引用的Course对象也被初始化了。
对于一个存在Java虚拟机中的对象来说,其内部的状态只是保存在内存中。JVM退出之后,内存资源也就被释放,Java对象的内部状态也就丢失了。而在很多情况下,对象内部状态是需要被持久化的,将运行中的对象状态保存下来(最直接的方式就是保存到文件系统中),在需要的时候可以还原,即使是在Java虚拟机退出的情况下。
对象序列化机制是Java内建的一种对象持久化方式,可以很容易实现在JVM中的活动对象与字节数组(流)之间进行转换,使用得Java对象可以被存储,可以被网络传输,在网络的一端将对象序列化成字节流,经过网络传输到网络的另一端,可以从字节流重新还原为Java虚拟机中的运行状态中的对象。
1.相关的接口
Java类中对象的序列化工作是通过ObjectOutputStream和ObjectInputStream来完成的。
ObjectOutputStream(OutputStream out); void writeObject(Object obj);//将指定的对象的非transient,非static属性,写入ObjectOutputStream ObjectInputStream(InputStream in); Object readObject();//从指定的流中读取还原对象信息
只能使用readObject()|writeObject()方法对对象进行读写操作。除对象之外,Java中的基本类型和数组也可以被序列化,对于基本类型,可以使用readInt(),writeInt(),
readDouble(),writeDouble()等类似的接口进行读写。
2.Serializable接口
对于任何需要被序列化的对象,都必须要实现接口Serializable,它只是一个标识接口,本身没有任何成员,只是用来标识说明当前的实现类的对象可以被序列化.
3.transient关键字
如果在类中的一些属性,希望在对象序列化过程中不被序列化,使用关键字transient标注修饰就可以.当对象被序列化时,标注为transient的成员属性将会自动跳过。
4.Java序列化中需要注意:
(1).当一个对象被序列化时,只保存对象的非静态成员变量,不能保存任何的成员方法,静态的成员变量和transient标注的成员变量。
(2).如果一个对象的成员变量是一个对象,那么这个对象的数据成员也会被保存还原,而且会是递归的方式。
(3).如果一个可序列化的对象包含对某个不可序列化的对象的引用,那么整个序列化操作将会失败,并且会抛出一个NotSerializableException。可以将这个引用标记transient,那么对象仍然可以序列化。
5.一个综合实例:
class Student implements Serializable{ private String name; private transient int age; private Course course; public void setCourse(Course course){ this.course = course; } public Course getCourse(){ return course; } public Student(String name, int age){ this.name = name; this.age = age; } public String toString(){ return "Student Object name:"+this.name+" age:"+this.age; } } class Course implements Serializable{ private static String courseName; private int credit; public Course(String courseName, int credit){ this.courseName = courseName; this.credit = credit; } public String toString(){ return "Course Object courseName:"+courseName +" credit:"+credit; } }
将对象写入文件,序列化
public class TestWriteObject{ public static void main(String[] args) { String filePath = "C://obj.txt"; ObjectOutputStream objOutput = null; Course c1 = new Course("C language", 3); Course c2 = new Course("OS", 4); Student s1 = new Student("king", 25); s1.setCourse(c1); Student s2 = new Student("jason", 23); s2.setCourse(c2); try { objOutput = new ObjectOutputStream(new FileOutputStream(filePath)); objOutput.writeObject(s1); objOutput.writeObject(s2); objOutput.writeInt(123); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally{ try { objOutput.close(); } catch (IOException e) { e.printStackTrace(); } } System.out.println("Info:对象被写入"+filePath); }
从文件中读取对象,反序列化
public class TestReadObject { public static void main(String[] args) { String filePath = "C://obj.txt"; ObjectInputStream objInput = null; Student s1 = null,s2 = null; int intVal = 0; try { objInput = new ObjectInputStream(new FileInputStream(filePath)); s1 = (Student)objInput.readObject(); s2 = (Student)objInput.readObject(); intVal = objInput.readInt(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }catch(ClassNotFoundException cnfe){ cnfe.printStackTrace(); }finally{ try { objInput.close(); } catch (IOException e) { e.printStackTrace(); } } System.out.println("Info:文件"+filePath+"中读取对象"); System.out.println(s1); System.out.println(s1.getCourse()); System.out.println(s2); System.out.println(s2.getCourse()); System.out.println(intVal); } }
输出:
[TestWriteObject]
Info:对象被写入C://obj.txt
[TestReadObjec]
Info:文件C://obj.txt中读取对象
Info:文件C://obj.txt中读取对象
Student Object name:king age:0
Course Object courseName:null credit:3
Student Object name:jason age:0
Course Object courseName:null credit:4
123
可知Person中的age属性被标注为transient后,在序列化对象时,age属性就没有被序列化了; Course中的name属性被static后,Course的name静态属性就没有被序列化;虽然是序列化Person对象,但是Person所引用的Course对象也被初始化了。
发表评论
-
Java中的"for each"循环
2011-11-27 16:59 13331."for each"循环 JDK5 ... -
Java中的内部类
2011-11-24 15:28 2135内部类(inner class) 内部 ... -
float f = 3.4语句正确吗?
2011-11-23 14:56 9641float f = 3.4语句正确吗] ... -
serialVersionUID
2011-11-22 20:31 1037serialVersionUID Java的序列化机制 ... -
如何编写一个自定义的Exception类
2011-11-22 20:11 2257如何编写一个自定义的Exception类 1.编写自定义异 ... -
Java线程新同步机制
2011-11-22 16:52 2672Java线程新的同步机制 1.可重入锁ReentrantLo ... -
Java线程wait-notify+sleep+synchronized
2011-11-21 20:40 62161.sleep-wait-yield区别 sleep是Th ... -
Math.round方法
2011-11-19 21:59 1063Math.round() java.lang.Math类有两 ... -
final&finally&finalize
2011-11-19 18:03 7811.final关键字可以用来修饰类,成员方法,方法的参数,成员 ... -
String str = new String("abc")创建几个对象?
2011-11-19 14:46 12721.在JVM中存在着一个字符串池,其中保存着很多的Stri ... -
类的初始化顺序
2011-11-19 14:05 1206类的初始化顺序 1.对于同一个类中的静态变量,静态初始化块, ... -
Java代码块
2011-11-15 22:19 4087Java代码块 一.在Java中,使用”{}”括起来的代码称 ... -
Java内存管理
2011-11-15 18:00 1097Java内存管理 一.Java内 ... -
Java内存管理
2011-11-15 18:00 0Java内存管理 一.Java内 ... -
hashCode()和equals方法
2011-11-13 16:56 15931.==是比较地址,equals() ... -
hashCode()和equals方法
2011-11-13 16:55 01.==是比较地址,equals() ... -
Java基础知识四
2011-11-10 23:48 9401.关于equals(),所有的类都继承了Object类,继承 ... -
Java基础知识三---static关键字
2011-11-10 14:06 827static变量,static函数,static块 1.st ... -
Java基础知识二
2011-11-10 14:04 7911.在Java中A a只是定义一个A类型的变量a,没有分配内存 ... -
Java基础知识一
2011-11-10 14:02 995(1).instanceof obj insta ...
相关推荐
Java对象序列化是一种将Java对象转换为字节流的过程,以便可以存储在磁盘上、在网络上传输或在任何其他需要持久化数据的场景中使用。这个过程涉及到两个主要概念:序列化(Marshalling)和反序列化(Unmarshalling)...
Xson是一个Java对象序列化和反序列化程序。支持Java对象到字节数组的序列化,和从字节数组到Java对象的反序列化。 Maven: <groupId>com.github.xsonorg</groupId> <artifactId>xson-core <version>1.0.1 ...
Java对象序列化是Java平台的一项重要特性,它允许将对象的状态转换为字节流,以便存储、传输或恢复。在本文中,我们将深入探讨关于Java对象序列化你可能不知道的五件事情,这些知识点对于理解和优化你的Java应用程序...
### Java对象序列化标准知识点详解 #### 一、系统架构概览 **1.1 概览** Java 对象序列化是一种将Java对象的状态转换成字节流的过程,以便于在网络上传输或存储到磁盘上。Java序列化标准定义了一套规则来描述如何...
【JAVA对象序列化保存为XML文件的工具类】 在Java编程中,对象序列化是一种将对象的状态转换为字节流的过程,以便可以存储或在网络上传输。而在反序列化时,这个字节流又可以恢复为原来的对象。Java提供了一个方便...
Java对象序列化与反序列化是Java编程中重要的概念,主要应用于数据持久化、网络传输以及存储等场景。本文将详细解析这两个概念及其在实际应用中的实现方式。 **一、Java对象序列化** 1. **定义**: Java对象序列化...
Java对象序列化是一种将对象转换为字节流的过程,以便可以将其存储在磁盘上,或者在网络中进行传输。这是Java平台提供的一种功能,允许程序员将任何Java对象持久化,即将其状态保存到磁盘,或者在网络中进行传输。...
Java对象序列化是Java平台提供的一种机制,允许将对象的状态转换为字节流,以便存储在磁盘上、通过网络传输或在不同时间点恢复。这个过程涉及到将一个复杂的Java对象模型转换为简单的二进制表示,使得数据可以在不同...
Java对象序列化是一种将Java对象转换为字节流的过程,以便可以存储这些对象或通过网络进行传输。这个过程是Java平台的核心特性,它允许开发者将复杂的对象结构持久化或者在网络间进行安全通信。序列化不仅可以用于...
序列化的过程就是对象写入字节流和从字节流中读取对象。...对象序列化功能非常简单、强大,在RMI、Socket、JMS、EJB都有应用。对象序列化问题在网络编程中并不是最激动人心的课题,但却相当重要,具有许多实用意义。
Java对象序列化是Java开发中的一个重要概念,它允许我们将Java对象转换为字节流,以便存储、传输或在不同时间点恢复。以下是五个可能不为人知的关于Java对象序列化的知识点,这些知识点对于深入理解Java开发至关重要...
Java对象序列化是一种将Java对象转换为字节流的过程,以便于存储、传输或在网络间进行通信。这一过程使得对象的状态能够被持久化,即使在程序关闭后也能重新恢复。在Java中,对象序列化是通过实现`java.io....
总的来说,Java对象序列化是一个强大的工具,但也需要根据具体的应用场景进行适当的优化。开发者需要平衡性能需求、代码的可读性和维护性,以实现最佳的序列化策略。在考虑优化时,应始终注意性能测试,确保所做的...
本文介绍了Java对象序列化的五种方式,并提供了选择最适合应用程序的数据格式和技术所需要的全部信息。这篇文章侧重于可以用来生成 Java对象以数据为中心的视图的技术。演示可以把 JavaBeans变成XML文档的各种方法,...
Java对象序列化是一种将Java对象转换为字节流的过程,以便可以存储或在网络上传输。这一过程至关重要,因为它允许我们持久化对象的状态,以便在稍后的时间点恢复这些对象。在Java中,对象序列化主要涉及到`...
android(包括java)序列化一个对象传给php去做处理,或是接到php...//将一个对象序列化后返回byte[] String phpserialstr=new String(b); 将变量phpserialstr传给php即可. PHPSerializer中还有unserialize方法,是反序列化
这就是Java对象序列化与反序列化的基本概念,以及如何与JSON格式结合使用的示例。在实际应用中,我们还需要考虑异常处理、性能优化以及安全性问题,比如使用`transient`关键字忽略某些字段,或者使用`@...