java序列化Serializable那些事

串行化也叫序列化,就是将实例的状态转化成文本(或二近制)的形式,以便永久保存(所以有时候也叫持久化,或者信息的冷藏等等)或在网间传递.也就是说,如果一个类的实例需要持久化或者需要在网间传递的时候,就用到了串行化 

Serialization是指把类或者基本的数据类型持久化(persistence)到数据流(Stream)中,包括文件、字节流、网络数据流。
        
JAVA中实现serialization主要靠两个类:ObjectOuputStream和ObjectInputStream。他们是JAVA
IO系统里的OutputStream和InputStream的子类。既然他们是JAVA IO中的流,那么就可以像操作一般的流一样来操作他们。下面是他们使用方法:

Java代码

  1. import java.io.ByteArrayInputStream;

  2. import java.io.ByteArrayOutputStream;

  3. import java.io.IOException;

  4. import java.io.ObjectInputStream;

  5. import java.io.ObjectOutputStream;

  6. import java.io.Serializable;
  7. public class Pair implements Serializable{
  8. private static final long serialVersionUID = -1874850715617681161L;

  9. private int type;

  10. private String name;
  11. public int getType() {

  12. return type;

  13. }
  14. public void setType(int type) {

  15. this.type = type;

  16. }
  17. public String getName() {

  18. return name;

  19. }
  20. public void setName(String name) {

  21. this.name = name;

  22. }
  23. public Pair(int type, String name) {

  24. super();

  25. this.type = type;

  26. this.name = name;

  27. }
  28. public static void main(String[] args) throws IOException, ClassNotFoundException {

  29. // TODO Auto-generated method stub

  30. //serialize object pair

  31. ByteArrayOutputStream bos = new ByteArrayOutputStream();

  32. ObjectOutputStream oos = new ObjectOutputStream(bos);

  33. Pair pair = new Pair(1, "charlie");

  34. oos.writeObject(pair);

  35. //deserialize object, get new object newpair

  36. ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());

  37. ObjectInputStream ois = new ObjectInputStream(bis);

  38. Pair newpair = (Pair) ois.readObject();
  39. System.out.println(newpair.getType()+":"+newpair.getName());

  40. }

  41. }

1.
这两个类都是decorator模式的,在创建他们的时候,都要传入一个基于字节的流,真正在底下存贮序列化数据的都是这些流。
2.
被持久化的类要实现Serializable接口,这个接口没有任何函数,只是一个标记接口。如果在一台机器上进行序列化,把得到的数据传送到另外一个机器上进行反序列化,那么这两台机器上的类应该是完全一样的,否则序列化是不会成功的。
3.
切记不要把上面代码中的bos用toString得到String,然后再从这个String中得到ByteArrayInputStream,再进行反序列化。bos是以字节存贮的,转成以字符存贮的String必然会造成数据的变化,而从String中到的byte[]也不会是之前那个byte[]了。我遇到过这个问题,是因为我想把序列化之后的数据存在xml文件中。这个问题的具体解决方法见我的另外一篇博客:http://zzy1943.iteye.com/blog/634553
java虚拟机在序列化和反序列化的时候都做了些什么?

javadoc中对这两个类的描述中对java的序列化机制进行了详细的描述:

引用

The default serialization mechanism for an object writes the class of the
object, the class signature, and the values of all non-transient and non-static
fields. References to other objects (except in transient or static fields) cause
those objects to be written also. Multiple references to a single object are
encoded using a reference sharing mechanism so that graphs of objects can be
restored to the same shape as when the original was
written.
默认的序列化机制写到流中的数据有:
1、对象所属的类
2、类的签名
3、所有的非transient和非static的属性
4、对其他对象的引用也会造成对这些对象的序列化
5、如果多个引用指向一个对象,那么会使用sharing
reference机制

引用

Classes that require special handling during the serialization and
deserialization process must implement special methods with these exact
signatures:

Java代码

  1. private void readObject(java.io.ObjectInputStream stream)

  2. throws IOException, ClassNotFoundException;

  3. private void writeObject(java.io.ObjectOutputStream stream)

  4. throws IOException

  5. private void readObjectNoData()

  6. throws ObjectStreamException;

java序列化Serializable那些事

时间: 2024-10-12 03:55:04

java序列化Serializable那些事的相关文章

Java 序列化Serializable详解(附详细例子)

Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程.   2.什么情况下需要序列化 a)当你想把的内存中的对象保存到一个文件中或者数据库中时候:b)当你想用套接字在网络上传送对象的时候:c)当你想通过RMI传输对象的时候: 3.如何实现序列化 将需要序列化的类实现Serializable接口就可以了,Seriali

Java 序列化Serializable详解(附详细例子)

1.什么是序列化和反序列化 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程. 2.什么情况下需要序列化  a)当你想把的内存中的对象保存到一个文件中或者数据库中时候: b)当你想用套接字在网络上传送对象的时候: c)当你想通过RMI传输对象的时候: 3.如何实现序列化 将需要序列化的类实现Serializable接口就可以了,Serializable接口中没有任何方法,可以理解为一个标记,即表明

java 序列化Serializable 详解

Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程.   2.什么情况下需要序列化 a)当你想把的内存中的对象保存到一个文件中或者数据库中时候:b)当你想用套接字在网络上传送对象的时候:c)当你想通过RMI传输对象的时候: 3.如何实现序列化 将需要序列化的类实现Serializable接口就可以了,Seriali

Java 序列化Serializable详解

Java 序列化Serializable详解(附详细例子) Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程.   2.什么情况下需要序列化 a)当你想把的内存中的对象保存到一个文件中或者数据库中时候:b)当你想用套接字在网络上传送对象的时候:c)当你想通过RMI传输对象的时候: 3.如何实现序列化 将需要序列化

Java 序列化Serializable

1.什么是序列化和反序列化Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程.   2.什么情况下需要序列化 a)当你想把的内存中的对象保存到一个文件中或者数据库中时候:b)当你想用套接字在网络上传送对象的时候:c)当你想通过RMI传输对象的时候: 3.如何实现序列化 将需要序列化的类实现Serializable接口就可以了,Serializable接口中没有任何方法,可以理解为一个标记,即表明这个

Java序列化Serializable和Externalizable

纸上得来终觉浅,绝知此事要躬行  --陆游       问渠那得清如许,为有源头活水来  --朱熹 什么是Java序列化?为什么出现Java序列化?如何实现Java序列化? 一.什么是Java序列化 Java序列化是指把Java对象转换为字节序列的过程:而Java反序列化是指把字节序列恢复为Java对象的过程. 二.为什么出现Java序列化 两个进程之间进行通信时,须要传输各种信息.比方文本,图像,声音等等,这些信息是通过二进制流的形式进行传输的. 那么进程之间是不是也能够传递对象数据呢?答案是

Java序列化(Serializable)与反序列化

序列化是干什么的 简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来.虽然你可以用你自己的各种各样的方法来保 存object states,但是Java给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化. 什么情况下需要序列化 当你想把的内存中的对象状态保存到一个文件中或者数据库中时候: 当你想用套接字在网络上传送对象的时候: 当你想通过RMI传输对象的时候: 序列化的几种方式 在Java中socket传输数据时,数据类型往往比较难

Java 序列化Serializable具体解释(附具体样例)

1.什么是序列化和反序列化 Serialization(序列化)是一种将对象以一连串的字节描写叙述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程. 2.什么情况下须要序列化  a)当你想把的内存中的对象保存到一个文件里或者数据库中时候. b)当你想用套接字在网络上传送对象的时候: c)当你想通过RMI传输对象的时候. 3.怎样实现序列化 将须要序列化的类实现Serializable接口就能够了.Serializable接口中没有不论什么方法,能够理解为一个标记

java序列化---转

Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization是一种将这些字节重建成一个对象的过程.   2.什么情况下需要序列化 a)当你想把的内存中的对象保存到一个文件中或者数据库中时候:b)当你想用套接字在网络上传送对象的时候:c)当你想通过RMI传输对象的时候: 3.如何实现序列化 将需要序列化的类实现Serializable接口就可以了,Seriali