黑马程序员---序列化与反序列化

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------


1.序列化与反序列化是干什么的 都用哪些类处理
正常对象是保存在堆中的但你程序用完对象就结束了 但你还想用怎么办 你可以把对象持久化(就是保存在硬盘上) 处理类是ObjectInputStream与 OjbectOutputStream
2.当你序列化一个对象 但当你改变对象 就不能反序列化了
其实jvm是根据 static final long serialVersionUID = 42L; 这个字段是否相同来决定是否能反序列化的 这个字段又是系统生成的 如果你想
做到即使是改变对象也能序列化 就要自己生成serialVersionUID
3.什么属性不能序列化
static 属性不能 因为static 是方法区的 而序列化只能是堆中的数据 所以不能序列化
还有就是 ransient int age 也是不能序列化的因为有transient关键字


代码实例

public class ObjectInputStream {

    public static void main(String[] args) throws Exception {

        writeObj();
        readerObj();

    }

    public static void writeObj() throws Exception {

        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("d:\\info.txt"));
        oos.writeObject(new Person("lisi", 39, "上海"));
        oos.close();

    }

    public static void readerObj() throws FileNotFoundException, Exception {
        java.io.ObjectInputStream ois = new java.io.ObjectInputStream(new FileInputStream("d:\\info.txt"));
        Person p = (Person) ois.readObject();
        System.out.println(p);
        ois.close();

    }

}

person pojo

public class Person implements Serializable {

    public static final long serialVersionUID = 42L;// 手动生成UID根据UID来标示一个类
                                                    // 当你改变person同样能序列反序列

    private String name;
    private int age;// transient int age 也是不能序列化的因为有transient关键字
    static String work = "北京";// 不能被序列化因为 static是放在方法区的 而对象是放在堆总的 序列化只能序列堆的对象

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public static String getWork() {
        return work;
    }

    public static void setWork(String work) {
        Person.work = work;
    }

    public static long getSerialversionuid() {
        return serialVersionUID;
    }

    public Person(String name, int age, String work) {
        this.work = work;
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + ",work=" + work + "]";
    }

}


---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值