黑马程序员技术交流社区

标题: 对象序列化问题 [打印本页]

作者: 凡延海    时间: 2012-5-21 15:04
标题: 对象序列化问题
import java.io.Serializable;
public class Student implements Serializable {
public  int id;
        private String name;
int age;
String dep;
public Student(int id,String name,int age,String dep)
{
  this.id=id;
  this.name=name;
  this.age=age;
  this.dep=dep;
}
}
}
}

继承了Serializable就表示这个对象可以被序列化,序列化到底是做什么的呢,Serializable有什么
作用呢?


作者: Fc10232    时间: 2012-5-21 15:09
实现了Serializable接口的对象,可将它们转换成一系列字节,并可在以后完全恢复回原来的样子
类通过实现 java.io.Serializable 接口以启用其序列化功能。
未实现此接口的类将无法使其任何状态序列化或反序列化。
作者: Fc10232    时间: 2012-5-21 15:12
简单的讲就是可以暂时的把不需要的东西放在一边,等有用的时候在让它恢复原样
作者: 胥江    时间: 2012-5-21 15:21
一个类只有实现了Serializable接口,它的对象才是可序列化的.
因此如果要序列化某些类的对象,这些类就必须实现Serializable接口。
而实际上,Serializable是一个空接口,没有什么具体内容,它的目的只是简单的标识一个类的对象可以被序列化
什么情况下需要序列化
a)当你想把的内存中的对象写入到硬盘的时候;
b)当你想用套接字在网络上传送对象的时候;
c)当你想通过RMI传输对象的时候;
再稍微解释一下:a)比如说你的内存不够用了,那计算机就要将内存里面的一部分对象暂时的保存到硬盘中,等到要用的时候再读入到内存中,硬盘的那部分存储空间就是所谓的虚拟内存。在比如过你要将某个特定的对象保存到文件中,我隔几天在把它拿出来用,那么这时候就要实现Serializable接口;
b)在进行java的Socket编程的时候,你有时候可能要传输某一类的对象,那么也就要实现Serializable接口;最常见的你传输一个字符串,它是JDK里面的类,也实现了Serializable接口,所以可以在网络上传输。
c)如果要通过远程的方法调用(RMI)去调用一个远程对象的方法,如在计算机A中调用另一台计算机B的对象的方法,那么你需要通过JNDI服务获取计算机B目标对象的引用,将对象从B传送到A,就需要实现序列化接口。
没有人说的话能全部准确,批判性的参考。
作者: 杨梦宇    时间: 2012-5-21 15:22

楼上说的很通俗易懂。序列化是一种将对象以一连串的字节描述的过程;反序列化deserialization是一种将这些字节重建成一个对象的过程。
比如说你想让一个类能够序列化
就编写:
  1. import java.io.Serializable;  

  2. class TestSerial implements Serializable {  

  3.        public byte version = 100;  

  4.        public byte count = 0;  

  5. }
复制代码
然后可以将类所生成的对象“存储”到文件中,以便用到时可以取出
  1. public static void main(String args[]) throws IOException {  

  2.        FileOutputStream fos = new FileOutputStream("temp.out");  

  3.        ObjectOutputStream oos = new ObjectOutputStream(fos);  

  4.        TestSerial ts = new TestSerial();  

  5.        oos.writeObject(ts);  

  6.        oos.flush();  

  7.        oos.close();  

  8. }
复制代码
想取出时 可以编写  这也就重建了对象
  1. public static void main(String args[]) throws IOException {  

  2.        FileInputStream fis = new FileInputStream("temp.out");  

  3.        ObjectInputStream oin = new ObjectInputStream(fis);  

  4.        TestSerial ts = (TestSerial) oin.readObject();  

  5.        System.out.println("version="+ts.version);  

  6. }
复制代码
执行结果是100

作者: 凡延海    时间: 2012-5-21 15:47
嗯,明白了,Serializable就是个标记吧,告诉系统这个类是可序列化对。我想问题想查了,感觉一个空的Serializable怎么能够让类序列化呢。虚拟机应该有相应的处理Serializable标记的机制,不需要我操心,呵呵。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2