学习分享总结第二篇–拷贝和序列化
java中的拷贝分为浅拷贝和深拷贝
Object o1 = new Object();
Object o2 = o1;
引用复制, o1和o2, 指向了同一个对象, 只是引用名不同, 改变其中一个, 另一个也会改变,
真正实现对象复制的方法:
被复制的类实现Clonenable接口 (该接口为标记接口, 不含任何方法)
覆盖clone()方法,访问修饰符设为public。方法中调用super.clone()方法得到需要的复制对象
浅拷贝在拷贝对象时,对于基本数据类型的变量会重新复制一份,而对于引用类型的变量只是对引用进行拷贝,没有对引用指向的对象进行拷贝
例如:
类A的属性中包含类B, 类A实现Clonenable接口, 类B没有实现
在对A进行clone时, 只会复制类B的引用, 改变类A的副本中的类B时, 类A本身的类B属性也会被改变;
要完全实现对类A的拷贝, 需要类B也实现Clonenable接口, 并在类A重写的clone()方法中, 对类B进行clone
这就是深拷贝.
深拷贝在拷贝对象时,同时会对引用指向的对象进行拷贝。
浅拷贝和深拷贝区别就在于是否对 对象中的引用变量所指向的对象进行拷贝。
序列化
序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。
在序列化期间,对象将其当前状态写入到临时或持久性存储区。
以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。
序列化的使用场景:
内存中的对象持久化时;
对象通过网络传输时;
java序列化的方式: 对象转为字节流
反序列化: 字节流读取成对象
序列化标识符: serialVersionUID, 反序列化时用来对比是否是同一对象
自定义serialVersionUID有两种用途:
1、 在某些场合,希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有相同的serialVersionUID。
2、 在某些场合,不希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有不同的serialVersionUID
static 静态成员变量不会被序列化;
transient 修饰的变量不会被序列化(比如密码, 敏感信息之类的, 增加安全性)
序列化的几种方式:
java, json, fastjson, hessian, proto stuff,
影响序列化性能的关键因素
序列化后的码流大小(网络带宽的占用);
序列化的性能(CPU资源占用);
是否支持跨语言(异构系统的对接和开发语言切换)。