Java序列化之Serializable

Java序列化之Serializable

Java的序列化流程如下:

Java序列化之Serializable

Java的反序列化流程如下:

Java序列化之Serializable

注意:并不是所有类都需要进行序列化,主要原因有两个

1)安全问题。Java中有的类属于敏感类,此类的对象数据不便对外公开,而序列化的对象数据很容易进行破解,无法保证其数据的安全性,因此一般这种类型的对象不会进行序列化。

2)资源问题。可以使用序列化字节流创建对象,而且这种创建时不受限制的,有时过多地创建对象会造成很大的资源问题,因此此类对象也不适宜进行序列化。

Serializable

Serializable是Java提供的一个序列化接口,它是一个空接口,专门为对象提供标准的序列化跟反序列化操作。

序列化过程:

1 Person p = new Person("name","id"); 2 File file = new File("cache.txt"); 3 FileOutputStream output = new FileOutputStream(file); 4 ObjectOutputStream objectOutputStream = new ObjectOutputStream(output); 5 objectOutputStream.writeObject(p); 6 output.close(); 7 objectOutputStream.close();

反序列化过程:

1      File file = new File("cache.txt"); 2 FileInputStream input= new FileInputStream(file); 3 ObjectInputStream objectInputStream = new ObjectInputStream(input); 4 Person p = (Person)objectInputStream.readObject(); 5 System.out.println(p.getName()+"---"+p.getId()); 6 input.close(); 7 objectInputStream.close(); 

需要序列化的类成员

    对象序列化时并不是所有成员都要转换成二进制的字节序列,因为为了节省存储或传输空间以及提高序列化效率,有些不必要的成员是无需序列化的。其中包括:

  静态变量。因为静态变量属于类的属性,并不属于某个具体实例,因此在序列化的时候无须进行序列化,反序列化时,可以直接获取类的静态成员引用。

  方法。方法只是一系列的操作集合,方法不会依赖对象,不会因为对象的不同,而操作不同,反序列化时,也可以从类中直接获取方法信息。 

继承关系的序列化

父类实现Serializable时,子类被序列化,父类也会被序列化。

父类没有实现Serializable时,子类被序列化,父类不会被序列化 

引用关系的序列化

    如果对一个实现了Serializable的类进行序列化操作,则同时对它的引用类进行序列化操作。如果引用类没有实现Serializable接口,JVM会抛出java.io.NotSerializableExeception.

1 class Person implements Serializable{ 2 private String name; 3 private Tool tool = new Tool(); 4 } 5 6 class Tool implements Serializable{ 7 8

  此时对Person类进行序列化操作,则会同时对Tool类进行序列化操作。若Tool类没有实现Serializable接口,则会抛出异常。

保护敏感数据:

  一个类加上序列化标识后,该类对象的所有属性信息将被序列化,然后进行本地存储或网络传输。然后有时对象中的某些字段属于敏感信息,不应暴露出来。如果对其也进行序列化,容易被破解,从而   造成安全隐患,例如常见的密码字段。

  Java提供一个关键字transient,即瞬时关键字。该关键字关闭字段的序列化,这样受保护的信息就不会因为序列化而对外暴露。

序列化标识ID

  试想一下这样的情景:两端进行网络传输序列化对象,由于某种原因,导致两端使用的类的版本不同,假设接收方的类被删除了几个字段。当发送发将对象的序列化字节流发送到接收方时,由于接收方 的类少了几个字段,而无法解析。 

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/cd9fc752e87c466a8dafc7523f4875c8.html