java中对象的序列化和反序列化

【对象的序列化和反序列化 】
1.定义:
序列化--将对象写到一个输出流中。反序列化则是从一个输入流中读取一个对象。类中的成员必须是可序列化的,而且要实现Serializable接口,这样的类的对象才能被序列化和反序列化。这个接口是一个表示型的接口。serialVersionUID是一个串行化类的通用标示符,反串行化就是使用这个标示符确保一个加载的类对应一个可串行化的对象。

自己指定了serialVersionUID,就可以在序列化后,去添加一个字段,或者方法,而不会影响到后期的还原,还原后的对象照样可以使用,而且还多了方法可以用。serialVersionUID的生成,可以写1,也可以写2,但最好还是按照摘要算法,生成一个惟一的指纹数字,eclipse可以自动生成的,jdk也自带了这个工具。一般写法类似于
private static final long serialVersionUID = -763618247875550322L;

2.序列化步骤:
1)创建一个对象输出流:可以包装一个其他类型的输出流。
2)通过对象输出流的writeObject()写对象。注意使用类型转化,转换为相应的类的对象。
3.反序列化步骤:
1)创建一个对象输入流:可以包装一个其他类型的输出流。
2)通过对象输出流的readObject()写对象。
4.什么对象需要被序列化?
序列化的基本想法是完成对实例信息的保证。因为实例信息在运行结束后就消失了。要储存什么信息呢?一定不是关于方法的信息。

5.使用注意事项:
a.有些属性处于安全考虑不能被序列化(或者不能被序列化),则用transit修饰,若想进一步控制序列化和反序列化,则类中提供readObject()方法和writeObject()方法,(反)序列化时就会调用自定义的方法。注意这两个方法不是在java.io.Serializable接口定义的,而是在ObjectInputStream和ObjectOutputStream类中定义的,这两个类实现ObjectInput 和ObjectOutput两个接口。下边是一个可变数组的例子,取自Java in a Nutshell 2rd Edition,它在串行化实现了高效的针对可变数组程度调整的方法:

public class IntList implements Serializable
{
// An array to store the numbers.
private int[] nums = new int[8];
// Index of next unused element of nums[].
private transient int size = 0;
/** Return an element of the array */
public int elementAt(int index) throws ArrayIndexOutOfBoundsException {
if (index >= size) throw new ArrayIndexOutOfBoundsException(index);
else return nums[index];
}
/** Add an int to the array, growing the array if necessary. */
public void add(int x) {
// Grow array, if needed.
if (nums.length == size) resize(nums.length*2);
// Store the int in it.
nums[size++] = x;
}
/** An internal method to change the allocated size of the array. */
protected void resize(int newsize) {
int[] oldnums = nums;
// Create a new array.
nums = new int[newsize];
// Copy array elements.
System.arraycopy(oldnums, 0, nums, 0, size);
}
/** Get rid of unused array elements before serializing the array. */
private void writeObject(ObjectOutputStream out) throws IOException {
// Compact the array.
if (nums.length > size) resize(size);
// Then write it out normally.
out.defaultWriteObject();
}
/** Compute the transient size field after deserializing the array. */
private void readObject(ObjectInputStream in)
throws IOException, ClassNotFoundException {
// Read the array normally.
in.defaultReadObject();
// Restore the transient field.
size = nums.length;
}
}

b.由于串行化是针对类的实例,也就是对象的,所以static这样的成员是类相关的,也就不会被串行化。
c.注意,API中一个类一旦被串行化了,那么它的父类都是串行化的。你自己设计的类要是想被串行化,那么其父类要确保都串行化。父类一旦串行化,则子类们都自动实现了串行化。所以内部类和可扩展类不建议串行化。

时间: 2024-08-06 11:56:19

java中对象的序列化和反序列化的相关文章

java中什么是序列化和反序列化

序列化:能够把一个对象用二进制的表示出来. 类似我第一个字节表示什么属性名词,第二个字节表示什么属性值,第几个字段表示有几个属性等. 而且这个二进制可以写到硬盘或者在网络上传输但不会破坏他的结构.一般远程方法调用是必须能够序列化的对象才行. 实现序列化需要实现java.io.Serializable接口.但我们可以再某些属性上添加一个关键字,让这个属性不被序列化.具体关键字怎么写我忘记了,你可以查一下.反序列化:就是通过序列化后的字段还原成这个对象本身.但标识不被序列化的字段是不会被还原的.如一

java中的对象的序列化与反序列化的知识点---IO学习笔记(四)

对象的序列化,反序列化 对象的序列化: 就是将Object转换成byte序列 对象的反序列化: 将byte序列转换成Object 序列化流,反序列化流 序列化流(ObjectOutputStream),是字节的过滤流->主要方法:writeObject() 反序列化流(ObjectInputStream)->主要方法:readObject() 序列化接口(Serializable) 对象必须实现序列化接口,才能进行序列化,否则将出现异常 这个接口,没有任何方法,只是一个标准. 基本的对象序列化

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

一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中: 2) 在网络上传送对象的字节序列. 在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存.比如最常见的是Web服务器中的Session对象,当有 10万用户并发访问,就有可能出现10万个Session对象,内存可能吃不消,于是Web容器就会把一些s

Java基础学习总结——Java对象的序列化和反序列化

一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中: 2) 在网络上传送对象的字节序列. 在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存.比如最常见的是Web服务器中的Session对象,当有 10万用户并发访问,就有可能出现10万个Session对象,内存可能吃不消,于是Web容器就会把一些s

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

我们知道Java中的对象都是存在于堆内存中的,而堆内存是可以被垃圾回收器不定期回收的.从对象被创建到被回收这一段时间就是Java对象的生命周期,也即Java对象只存活于这个时间段内. 对象被垃圾回收器回收意味着对象和对象中的成员变量所占的内存也就被回收,这意味着我们就再也得不到该对象的任何内容了,因为已经被销毁了嘛,当然我们可以再重新创建,但这时的对象的各种属性都又被重新初始化了.所以如果我们需要保存某对象的状态,然后再在未来的某段时间将该对象再恢复出来的话,则必须要在对象被销毁即被垃圾回收器回

Java实现对象的序列化

什么是对象的序列化? 序列化:把对象转化成字节序列的过程就是对象的序列化:反序列化:把字节序列转化成对象的过程就是对象的反序列化.单看概念比较抽象,但是看代码就会明白. 对象序列化的用途 1.Java程序在运行中,对象都是分配在内存中,而序列化的一个用途就是将内存的中对象转化成磁盘中的对象. 2.对象不能直接在网络中传输,有时候需要将对象转成字节序列在网络中传输,这就是对象序列化的第二个用途. 如何实现对象的序列化? 1.新建一个实体对象,实现Serializable接口,这个实体对象就可以进行

对象的序列化与反序列化---IO学习笔记(四)

对象的序列化,反序列化 对象的序列化: 就是将Object转换成byte序列 对象的反序列化: 将byte序列转换成Object 序列化流.反序列化流 序列化流(ObjectOutputStream),是字节的过滤流->主要方法:writeObject() 反序列化流(ObjectInputStream)->主要方法:readObject() 序列化接口(Serializable) 对象必须实现序列化接口.才干进行序列化.否则将出现异常 这个接口,没有不论什么方法,仅仅是一个标准. 主要的对象

对象的序列化和反序列化

一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中: 2) 在网络上传送对象的字节序列. 在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存.比如最常见的是Web服务器中的Session对象,当有 10万用户并发访问,就有可能出现10万个Session对象,内存可能吃不消,于是Web容器就会把一些s

Java中对象和JSON互相转换的工具类

业务场景 工作中,经常出现:JSON 格式的字符串与 Java 对象互相转换的情形.比如单点登陆,将“用户信息”保存到 redis 时,Java 对象要转成 JSON 字符串,从 redis 取出“用户信息”后,要将 JSON 字符串转成 Java 对象.使用MongoDB保存和读取某些运算的结果集也是如此,因此,我们需要一个合适的轮子. JSON有两种格式,一种是对象,另一种是数组.大括号保存对象,中括号保存数组. {"name":"JSON","add