Serializable

1

  • Serializable:序列化

对象的生命周期常随着生成该对象的程序的终止而终止,有时候需要把内存中的各种对象状态(也就是实例变量,不是方法)保存下来并且可以在需要时再将对象恢复.虽然你可以用你自己的方法保存对象的状态,但是java提供了一种应该比我们好的保存对象状态的机制,那就是序列化

  • 什么情况下需要序列化:

    • 当你想要把内存中的对象状态保存到一个文件中或者数据中的时候
    • 当你想用套接字在网络上传送对象的时候
    • 当你想要通过RMI传输对象的时候
  • 注意事项:

    • 序列化时,只对对象的状态保存,而不管对象的方法
    • 当一个父类实现序列化时,子类自动序列化,不需要显式实现Serializable接口
    • 当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象序列化
    • 并非所有的对象都可以序列化.
  • 为什么java需要进行序列化

java序列化:一特定的方式对类实例的瞬时状态进行编码保存的一种操作.

  • 序列化作用的对象是类的实例,对实例进行序列化,就是保存实例当前在内存中的状态,包括实例的每一个属性的值和引用

  • 反序列化,是将序列化的编码解码成类实例的瞬时状态

序列化就是为了保存java类的对象状态,保存这个状态的作用主要用于不同jvm之间进行类实例间的共享。
在ORMaping中的缓存机制,进行缓存同步时,便是常见的java序列化的应用之一。
在进行远程方法调用,远程过程调用时,采用序列化对象的传输也是一种应用。
当你想从一个jvm中调用另一个jvm的对象时,你就可以考虑使用序列化了。

序列化的作用就是为了不同jvm之间共享实例对象的一种解决方案,由java提供此机制,效率之高,是其他解决方案无法比拟的.

transient关键字

经常在实现了 Serializable接口的类中能看见transient关键字。这个关键字并不常见。

  • transient关键字的作用是:阻止实例中那些用此关键字声明的变量持久化;当对象被反序列化时(从源文件读取字节序列进行重构),这样的实例变量值不会被持久化和恢复。
  • 当某些变量不想被序列化,同是又不适合使用static关键字声明,那么此时就需要用transient关键字来声明该变量。

2

public class Man implements Serializable {
    private int age;
    private String name;
    private static final long serialVersionUID = -2095916884810199532L;

    public int getAge() {
        return age;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
public class Test {
    public static void main(String[] args) {
        //初始化
        Man man = new Man();
        man.setAge(24);
        man.setName("luott");
        System.out.println(man);
        //将对象写入文件

        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("myman.txt"));) {
            oos.writeObject(man);

        } catch (IOException e) {
            e.printStackTrace();
        }

        //从文件读出对象
        InputStream in;
        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("myman.txt")));) {
            Man man1 = (Man) ois.readObject();
            System.out.println(man1);
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值