黑马程序员技术交流社区

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

作者: 顾传文    时间: 2013-2-28 14:18
标题: 对象序列化
本帖最后由 顾传文 于 2013-3-12 09:14 编辑

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
class Test {
    public static void main(String[] args) throws Exception{
        writerObj();
        readObj();
    }
    //将堆内存中的Perosn对象保存到文件中
    public static void writerObj() throws Exception{
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(
                new FileOutputStream("c:\\persons.object"));
        objectOutputStream.writeObject(new Person("guchuanwen",25,"chinese"));
    }
    //将文件中的内容读到堆内存中。
    public static void readObj() throws Exception{
        ObjectInputStream objectInputStream = new ObjectInputStream(
                new FileInputStream("c:\\persons.object"));
        Person person = (Person)objectInputStream.readObject();
        System.out.println(person);
    }
}
/**
* Serializable接口没有需要实现方法,
* 没有实现方法的接口为标记接口。
*/
class Person implements Serializable{
    //serialVersionUID的访问修饰符没有要求,可以为public,private...
    public static final long serialVersionUID = 42L;
    private String name;
    private transient Integer age;
    static String country ="cn";
    public Person(String name,Integer age,String country){
        this.name = name;
        this.age = age;
        this.country = country;
    }
    public String toString(){
        return name+":"+age+":"+country;
    }
}
打印结果:guchuanwen:null:chinese

怎么我这里的county读出来不是cn而是Chinese呢?static类型的字段不是不被序列化的吗?
作者: 颜春    时间: 2013-2-28 15:00
对 你说的没错  声明为static和transient类型的成员数据不能被序列化。因为static代表类的状态
但是this关键字 是指向当前对象 也就是重新给country附上了值     

如果想输出cn 的话   把this去掉 就体现声明为static类型的成员变量不能被序列化
作者: lzw123451    时间: 2013-2-28 15:10
静态成员不会被序列化。(当把obj对象写入到文件中时,修改后的静态成员数据不保存入(原始值是什么就还是什么)。它只对堆中的对象序列化)
还有就是 有关键字transient关键字修饰的成员 不被序列化。

具体看毕老师视频   IO流(对象的序列化)




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