黑马程序员技术交流社区
标题:
对象序列化问题。。
[打印本页]
作者:
赵家阳
时间:
2013-4-10 18:46
标题:
对象序列化问题。。
本帖最后由 赵家阳 于 2013-4-15 17:43 编辑
<div class="blockcode"><blockquote>import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class ObjectStreamDemo {
public static void main(String[] args) throws Exception{
writeObj();
readObj();
}
public static void writeObj() throws IOException {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("obj1.txt"));
oos.writeObject(new Person("Jy",12,"china"));
oos.close();
}
public static void readObj() throws IOException, ClassNotFoundException{
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("obj1.txt"));
Person p = (Person)ois.readObject();
System.out.println(p);
ois.close();
}
}
class Person implements Serializable{
static final long serialVersionUID = 889;
String name;
static int age = 23;
static String country = "cn" ;
Person(String name,int age,String country){
this.name = name;
this.age = age;
this.country = country;
}
public String toString(){
return name+"::"+age+"::"+country;
}
}
复制代码
问题:在对象序列化时,有这么一句话“声明为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