欢迎分享,转载请注明来源:内存溢出
1
、什么是
java
序列化,如何实现
java
序列化?
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写 *** 作,也可将流化后的对
象传输于网络之间。序列化是为了解决在对对象流进行读写 *** 作时所引发的问题。序列化的实现:将需要被序列化的类实现
Serializable
接
口,该接口没有需要实现的方法,
implements Serializable
只是为了标注该对象是可被序列化的,然后使用一个输出流
(
如:
FileOutputStream)
来构造一个
ObjectOutputStream(
对象流
)
对象,接着,使用
ObjectOutputStream
对象的
writeObject(Object obj)
方法
就可以将参数为
obj
的对象写出
(
即保存其状态
)
,要恢复的话则用输入流。
2
、保存
(
持久化
)
对象及其状态到内存或者磁盘
Java
平台允许我们在内存中创建可复用的
Java
对象,但一般情况下,只有当
JVM
处于运行时,这些对象才可能存在,即,这些对象的生命
周期不会比
JVM
的生命周期更长。 但在现实应用中,就可能要求在
JVM
停止运行之后能够保存
(
持久化
)
指定的对象,并在将来重新读取被保
存的对象。
Java
对象序列化就能够帮助我们实现该功能。
3
、序列化对象以字节数组保持
-
静态成员不保存
使用
Java
对象序列化,
在保存对象时,会把其状态保存为一组字节,在未来,
再将这些字节组装成对象。必须注意地是,
对象序列化保存
的是对象的
”
状态
”
,即它的成员变量。由此可知,对象序列化不会关注类中的静态变量。
4
、序列化用户远程对象传输
除了在持久化对象时会用到对象序列化之外,当使用
RMI(
远程方法调用
)
,或在网络中传递对象时,都会用到对象序列化。
Java
序列化
API
为处理对象序列化提供了一个标准机制,该
API
简单易用。
5
、
Serializable
实现序列化
在
Java
中,
只要一个类实现了
java.io.Serializable
接口,那么它就可以被序列化。
ObjectOutputStream
和
ObjectInputStream
对对象进
行序列化及反序列化通过
ObjectOutputStream
和
ObjectInputStream
对对象进行序列化及反序列化。
6
、
writeObject
和
readObject
自定义序列化策略
//
获取
Person
类的
Class
对象
Class clazz
=
Class
.
forName
(
"reflection.Person"
);
//
使用
.newInstane
方法创建对象
Person p
=
(
Person
)
clazz
.
newInstance
();
//
获取构造方法并创建对象
Constructor c
=
clazz
.
getDeclaredConstructor
(
String
.
class
,
String
.
class
,
int
.
class
);
//
创建对象并设置属性
13/04/2018
Person p1
=
(
Person
)
c
.
newInstance
(
"
李四
"
,
"
男
"
,
20
);
在类中增加
writeObject
和
readObject
方法可以实现自定义序列化策略。
7
、序列化
ID
虚拟机是否允许反序列化,不仅取决于类路径和功能代码是否一致,一个非常重要的一点是两个类的序列化
ID
是否一致(就是
private
static fifinal long serialVersionUID
8
、序列化并不保存静态变量
序列化子父类说明
要想将父类对象也序列化,就需要让父类也实现
Serializable
接口。
9
、
Transient
关键字阻止该变量被序列化到文件中
1.
在变量声明前加上
Transient
关键字,可以阻止该变量被序列化到文件中,在被反序列
化后,
transient
变量的值被设为初始值,如
int
型的是
0
,对象型的是
null
。
2.
服务器端给客户端发送序列化对象数据,对象中有一些数据是敏感的,比如密码字符串
等,希望对该密码字段在序列化时,进行加密,而客户端如果拥有解密的密钥,只有在
客户端进行反序列化时,才可以对密码进行读取,这样可以一定程度保证序列化对象的
数据安全。
10
、序列化(深
clone
一中实现)
在
Java
语言里深复制一个对象,常常可以先使对象实现
Serializable
接口,然后把对象(实际上只是对象的一个拷贝)写到一个流里,再从
流里读出来,便可以重建对象。
Java
注解面试题
1
、
4
种标准元注解是哪四种?
元注解的作用是负责注解其他注解。
Java5.0
定义了
4
个标准的
meta-annotation
类型,它们被用来提供对其它
annotation
类型作说明。
@Target
修饰的对象范围
@Target
说明了
Annotation
所修饰的对象范围:
Annotation
可被用于
packages
、
types
(类、接口、枚举、
Annotation
类型)、类型成员
(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、
catch
参数)。在
Annotation
类型的声明中使用了
target
可更加明晰其修饰的目标
@Retention
定义 被保留的时间长短
Retention
定义了该
Annotation
被保留的时间长短:表示需要在什么级别保存注解信息,用于描述注解的生命周期(即:被描述的注解在
什么范围内有效),取值(
RetentionPoicy
)由:
1. SOURCE:
在源文件中有效(即源文件保留)
2. CLASS:
在
class
文件中有效(即
class
保留)
3. RUNTIME:
在运行时有效(即运行时保留)
4.
@Documented
描述
-javadoc
@ Documented
用于描述其它类型的
annotation
应该被作为被标注的程序成员的公共
API
,因
此可以被例如
javadoc
此类的工具文档化。
@Inherited
阐述了某个被标注的类型是被继承的
@Inherited
元注解是一个标记注解,
@Inherited
阐述了某个被标注的类型是被继承的。如果一
个使用了
@Inherited
修饰的
annotation
类型被用于一个
class
,则这个
annotation
将被用于该
class
的子类。
2
、注解是什么?
Annotation
(注解)是
Java
提供的一种对元程序中元素关联信息和元数据(
metadata
)的途径和方法。
Annatation(
注解
)
是一个接口,程
序可以通过反射来获取指定程序中元素的
Annotation
对象,然后通过该
Annotation
对象来获取注解中的元数据信息。
赞
(0)
打赏
微信扫一扫
支付宝扫一扫
flutter 打包出错 应用签名 报错 error
上一篇
2022-05-06
leetcode-按奇偶排序数组
下一篇
2022-05-06
评论列表(0条)