A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 赵家阳 中级黑马   /  2013-4-10 18:46  /  1283 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 赵家阳 于 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不行?
求指教。。。求序列化知识详情。。。

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

2 个回复

倒序浏览
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()方法中对其序列化

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马