美文网首页
Java 重新理解Serializable

Java 重新理解Serializable

作者: 业余的猫 | 来源:发表于2017-10-09 21:00 被阅读0次
  • Java 序列化:指的是将Java对象通过流的方式写到磁盘上将其保存起来。

最初是为了支持RMI(Remote Method Invocation)远程方法调用,它可以实现其它计算机访问该对象就像自己的计算机访问该对象那么的简单,还有就是JavaBean这种对象在设计阶段启动时的状态配置。一般将对象或者异常输出到文件作持久化或者通过网络传输到其它计算机进行处理。

  • Java反序列化:序列化的逆过程,将序列化到文件中的内容反序列化成对象。

程序实现

class Student implements Serializable {
    public static int week;
    private String name;
    private int age;
    // 使用transient关键字后不会序列化该字段
    private transient String homeWork;

    public Student(String name, int age, String homeWork, int weekday) {
        this.name = name;
        this.age = age;
        this.homeWork = homeWork;
        week = weekday;
    }

    @Override
    public String toString() {
        return "Student [" + "name=" + name + ", "
                + "age=" + age + ", homeWork=" + homeWork + ", "
                + "static week=" + week + "]";
    }

}

private static void serializeStudent() throws IOException {
    ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("d:/student"));
    oos.writeObject(new Student("小明", 10, "做数学题", 2));
    oos.close();
}

private static Student deserializeStudent() throws IOException, ClassNotFoundException {
    ObjectInputStream ois = new ObjectInputStream(new FileInputStream("d:/student"));
    Student stu = (Student) ois.readObject();
    ois.close();
    return stu;
}

第一次测试

public static void main(String[] args) throws IOException, ClassNotFoundException {
    serializeStudent();
    System.out.println(deserializeStudent());//Student [name=小明, age=10, homeWork=null, static week=2]
}

嗯。。看似很完美,先别急,接着第二次测试。。

public static void main(String[] args) throws IOException, ClassNotFoundException {
    //serializeStudent();
    //因为之前已经序列化并且保存到磁盘了,现在直接进行反序列化操作
    System.out.println(deserializeStudent());//Student [name=小明, age=10, homeWork=null, static week=0]
}

看到这里,有没有发觉程序结果发生了小小的变化?没错那就是week这个静态变量。说到这里可能有人就有疑问了,那么之前的那个week怎么就没错呢?这个其实是因为static变量在经类加载器加载过后会永驻内存,事实上不管你是否进行序列化和反序列化它都是那个值,也就是2。但第二次测试后,Jvm重新运行当然要重新加载Student了,因为序列化并不会对static起作用,所以week这个变量并没有保存,那么week自然就是默认值,也就是0,

防止序列化和反序列化,当调用writeObject(Object obj)方法时会检查该对象是否具有writeObject()和readObject()方法如果有,则通过反射进行调用。

//防止序列化
private void writeObject(ObjectOutputStream os )throws IOException {
    throw new RuntimeException("");
}
//防止反序列化
private void readObject(ObjectInputStream in) throws IOException {
    throw new RuntimeException();
}

相关文章

  • Java 重新理解Serializable

    Java 序列化:指的是将Java对象通过流的方式写到磁盘上将其保存起来。 最初是为了支持RMI(Remote M...

  • 数据序列化个人理解

    理解(概念上):Java类=>字节码 狭义上序列化: Java=> Serializable (基于存储,直接...

  • Android面试整合

    Java Serializable 和Parcelable Serializable 和Parcelable为An...

  • NIO你真正了解多少?

    解释一下java.io.Serializable接口 类通过实现 Java.io.Serializable 接口以...

  • 收藏-Java

    # 我对Java Serializable(序列化)的理解和总结# Lambda 表达式有何用处?如何使用? # ...

  • Serialization in Java

    Serializable in Java Class Refactoring with Serialization...

  • 理解Serializable

    序列化和持久化很相似,有些人甚至混为一谈,其实还是有区别的,序列化是为了解决对象的传输问题,传输可以在线程之间、进...

  • 关于序列化的知识

    1、Parcelable和Serializable有什么用,它们有什么差别?. Serializable是Java...

  • java基础——异常

    父类java.lang.Throwable(implements java.io.Serializable) ...

  • 序列化与反序列化区别

    Parcelable与Serializable Serializable是Java中的序列化接口,使用起来简单但是...

网友评论

      本文标题:Java 重新理解Serializable

      本文链接:https://www.haomeiwen.com/subject/qkzmattx.html