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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 HM许涛 于 2013-4-13 22:16 编辑

书上说 ObjectinputStream和ObjectoutputStream不会保存和读取对象中的transient和static类型的成员变量。但是我做的transient是可以实现不保存的功能,static修饰的怎么没有实现啊,还是会出现。有没哪位大神解释一下两个方法的区别和我的错误在哪里?
简单点说:我用transient修饰ID,输出结果为0,我用static修饰,没影响,原来数据是多少输出还是多少。

我用的代码,张孝祥老师JAVA就业培训教材P263也例子。
/*
ObjectinputStream ObjectoutputStream ,保存和读取对象成员变量取值。需要实现Serializable(序列化)接口。
被变量修饰符 transient(短暂的,临时的) 静态修饰符 static修饰的成员变量不会保存和读取。
使用ObjectinputStream与ObjectoutputStream类保存和读取对象的机制叫序列化。
*/
import java.io.*;
public class Serialization
{
public static void main(String[] args) throws IOException,ClassNotFoundException
{
  Student stu=new Student(19,"dingding",50,"huaxue");
  FileOutputStream fos=new FileOutputStream("mytext.txt");//节点流FileOutputStream 创建流节点 mytext.txt文件。
  ObjectOutputStream os=new ObjectOutputStream(fos);//过滤流类(处理流类、包装类)ObjectOutputStream调用节点流类实例对象fos
  
  try
  {
   os.writeObject(stu);//过滤流类实例对象 os调用writeObject()方法写入stu数据。
   os.close();//关闭流。释放资源。
  }
  catch (IOException e)
  {
    System.out.println(e.getMessage());
  }
  stu=null;
  FileInputStream fi=new FileInputStream("mytext.txt");
  ObjectInputStream si=new ObjectInputStream(fi);
  try
  {
   stu=(Student)si.readObject();//利用类中的readObject()和 writeObject()方法可以读/写对象流。
   si.close();
  }
  catch (IOException e)
  {
   System.out.println(e.getMessage());
  }
   System.out.println("ID IS  "+stu.id);
    System.out.println("name is  "+stu.name);
     System.out.println("age is  "+stu.age);
      System.out.println("department is  "+stu.department);
}
}
class Student implements Serializable
{
transient int id;//transient 修饰的不能保存和读取,输出结果为0.
transient String name;
static int age;//奇怪,static修饰的可以存储读取,有待解决。
static String department;
public Student(int id,String name,int age,String department)
{
  this.id=id;
  this.name=name;
  this.age=age;
  this.department=department;
}
}

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

3 个回复

倒序浏览
本帖最后由 ①人←①城市 于 2013-4-12 15:37 编辑

定义为transient的字段值在对象串行化过程中将不被保存。
如果你将一个字段定义为static,则所有对象都将共享此字段的一份拷贝。当你将一个新值赋给这个字段时,所有对象都将得到这个新值。如果没有指定为static,则这个字段将是一个实例字段,每个对象都使用他们自己的一份拷贝。

比如说在一个实体Bean中,transient和 static字段是非持久性字段,不能保存在数据库中。
另外,如果你的对象需要序列化到数据库、JDNI或通过Object流传递给其他对象的话,对象中的非持久性字段应该加transient关键字。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报

如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢
回复 使用道具 举报
①人←①城市 发表于 2013-4-12 09:54
定义为transient的字段值在对象串行化过程中将不被保存。
如果你将一个字段定义为static,则所有对象都将共 ...

嗯,还需要多理解一下。谢啦
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马