大型门户网站多少钱,做棋牌网站违法嘛,哈尔滨建设规划局网站,中国企业500强名单目录 一、Java序列化与反序列化是什么#xff1f;
二、为什么需要序列化与反序列化#xff1f;
三、序列化的实现方式有哪些#xff1f;
四、什么是serialVersionUID?
五、为什么还要显示指定serialVersionUID
六、serialVersionUID什么时候修改#xff1f;
七、Jav…目录 一、Java序列化与反序列化是什么
二、为什么需要序列化与反序列化
三、序列化的实现方式有哪些
四、什么是serialVersionUID?
五、为什么还要显示指定serialVersionUID
六、serialVersionUID什么时候修改
七、Java序列化如果有些字段不想序列化怎么办
八、静态变量会序列化吗 一、Java序列化与反序列化是什么
Java序列化就是将对象转为字节序列
Java反序列化就是将字节序列转为内存中的对象
二、为什么需要序列化与反序列化
其实大的来说就是为了保存对象的信息 状态信息 因为JVM一旦关闭 其对象也会被销毁 如何持久化对象就需要使用到序列化机制
另外就是为了便于网络传输传输信息传输字节序列给对方对方接收到再进行反序列化就能获取到对象信息像RPC或者是OpenFeign远程调用就是将对象进行序列化与反序列化的过程其实就是实现分布式对象多个服务可以使用同一对象
除此之外序列化与反序列化机制还能用于实现深拷贝序列化不仅只序列化当前对象其对象里面的里面也会递归的序列化
三、序列化的实现方式有哪些
类实现Serializable接口 或者是实现Externalizable接口
实现Serializable接口的方式很简单只需要实现这个接口不需要实现里面的任何方法因为里面就没方法然后在类里面指定一个serialVersionUID就行 注意这个必须是static final long的
而实现Externalizable接口的方式就更加的灵活了可以指定我们需要序列化的字段而如何指定呢就通过实现Externalizable接口接口中的readExternal和writeExternal方法就可以了
例子
public class User implements Externalizable {private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name name;}public void writeExternal(ObjectOutput out) throws IOException {out.writeObject(name);}public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {name (String) in.readObject();}Overridepublic String toString() {return User{ name name };}
}
两者的对比
Serializable接口更为简单它是按照系统默认的序列化规则能序列化所有属性。但是效率不高
Externalizable接口需要自己重写两个方法可以指定序列化字段如果不重写的话默认是属性类型的默认值 效率高
四、什么是serialVersionUID?
就是一个类的标识需要依靠这个来反序列化。它的过程是拿到序列化中的serialVersionUID值然后与本地的类的serialVersionUID作比较如果相同则反序列化成本地类对象如果不同则序列化失败
五、为什么还要显示指定serialVersionUID
如果不显示指定那么这个值就会根据类的属性来自动生成有一个serialVersionUID值因此如果类中属性变化了这个值就会发生变化。
如果再我们序列化之后修改了类中的属性那么此时这个serialVersionUID值就会与它原先当初序列化时类中的serialVersionUID不一样所以就会反序列化失败。
因此一般我们要手动的指定一个serialVersionUID值
六、serialVersionUID什么时候修改
一般的时候不要修改除非软件不兼容的情况 因为不兼容 所以不允许类随意发生改变
七、Java序列化如果有些字段不想序列化怎么办
使用transient修饰 或者类实现Externalizable接口的方式重写方法指定
八、静态变量会序列化吗
不会因为静态变量属于类而序列化的是对象的信息。
至于为什么静态的serialVersionUID可以被序列化 是因为JVM作了特殊判断因为需要依靠它来进行反序列化