黑马程序员技术交流社区

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

作者: 赵家阳    时间: 2013-4-10 18:46
标题: 对象序列化问题。。
本帖最后由 赵家阳 于 2013-4-15 17:43 编辑
  1. <div class="blockcode"><blockquote>import java.io.FileInputStream;
  2. import java.io.FileNotFoundException;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. import java.io.ObjectInputStream;
  6. import java.io.ObjectOutputStream;
  7. import java.io.Serializable;

  8. public class ObjectStreamDemo {

  9.         public static void main(String[] args) throws Exception{
  10.                 writeObj();
  11.                 readObj();
  12.         }
  13.         public static void writeObj() throws IOException {
  14.                 ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("obj1.txt"));
  15.                 oos.writeObject(new Person("Jy",12,"china"));
  16.                 oos.close();
  17.         }
  18.         public static void readObj() throws IOException, ClassNotFoundException{
  19.                 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("obj1.txt"));
  20.                 Person p = (Person)ois.readObject();
  21.                 System.out.println(p);
  22.                 ois.close();
  23.         }

  24. }
  25. class Person implements Serializable{
  26.         static final long serialVersionUID = 889;
  27.         String name;
  28.         static int age = 23;
  29.         static String country = "cn" ;
  30.         
  31.         Person(String name,int age,String country){
  32.                 this.name = name;
  33.                 this.age = age;
  34.                 this.country = country;
  35.         }
  36.         public String toString(){
  37.                 return name+"::"+age+"::"+country;
  38.         }
  39. }
复制代码
问题:在对象序列化时,有这么一句话“声明为static和transient类型的成员数据不能被串行化。因为static代表类的状态, transient代表对象的临时数据;”,也就是说,被static修饰的成员,不能被序列化,可是这段代码里为什么country不行?
求指教。。。求序列化知识详情。。。
作者: 谢达    时间: 2013-4-10 21:28
1、如果一个类仅仅实现了Serializeble接口,那么将按照以下方式序列化及反序列化对象
1、ObjectOutputStream采用默认的序列化方式,对类对象的非transient的实例变量进行序列化
2、ObjectInputStream采用默认反序列化方式,对类对象的非transient的实例变量进行反序列化.
2、如果一个类不仅实现了Serializable接口,并且还定义了readObject(ObjectInputStream in)和writeObject(ObjectOutputStream out),那么就会按照下列方式序列化及反序列化对象
1、ObjectInputStream会调用类的writeObject()方法来进行序列化
2、ObjectOutputStream会调用类的readObjct()方法来进行反序列化

当ObjectInputStream按照默认方式反序列化时,有以下特点:
1,如果内存中对象所属的类还没有被加载,那么会先加载并初始化这个类,如果在classpath中不存在相应的类文件,会抛出ClassNotFoundException.
2、在反序列化时不会调用类的任何构造方法

transient修饰符主要用来修饰以下类型变量:
1.实例变量不代表对象的固有内部数据,仅仅代表具有一定逻辑含义的零时数据
2.实例变量表示一些比较敏感的信息,处于安全方面的原因,不希望对其序列化
3.实例变量需要按照用户自定义的方式进行序列化,如加过加密后再序列化,在这种情况下可以把实例变量定义为transient类型,然后在writeObject()方法中对其序列化
作者: 黄玉昆    时间: 2013-4-15 12:56
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢




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