相关注意事项
a)序列化时,只对对象的状态进行保存,而不管对象的方法;
b)当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口;
c)当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化;class Super implements Serializable {
private static final long serialVersionUID = -2589766491699675794L;
final Set<Super> set = new HashSet<>();
}
final class Sub extends Super {
.....
set.add(this) // 违反规则
}A: 序列化对外公开了对象的物理实现
B: 序列化容易使一个类对其最初的内部表示产生依赖
C: 编写正确的反序列化代码有很大的挑战
D: 序列化增大了安全风险
E: 序列化增加了测试的难度A. jdk提供的序列化操作,会将Java对象序列化二进制流,可以有效防止信息泄露或恶意篡改
B. Java的反序列化操作,可以绕过对象构造函数的执行
C. 对象序列化后,即使包含敏感数据也不会产生风险
D. Java反序列化时,目标class与预期class不一致时,会导致类型转换错误,所以即使反序列化不可信数据也不会有安全风险A. XMLDecoder是jdk原生类,提供了xml的反序列化操作,所以相对Xstream,更推荐使用XMLDecoder进行xml数据的反序列化操作
B. 使用jdk原生api进行反序列化操作,涉及不可信数据时,可以重载ObjectInputStream的resolveClass()方法,在该方法中对目标class进行白名单校验
C. 对不可信的XML数据进行反序列化操作,推荐使用XStream实现,该组件支持白名单检查,新版本也提供了默认安全校验机制
D. 对不可信的json数据进行反序列化操作,可通过禁止开启type功能进行防护A. 序列化只能保存对象的非静态成员交量,不能保存任何的成员方法和静态的成员变量
B. transient关键字的作用是:阻止实例中那些用此关键字声明的变量持久化
C. 当一个父类实现序列化,子类若要实现序列化,需要显式实现Serializable接口
D. 一个子类实现了Serializable接口,它的父类都没有实现Serializable接口,要想将父类对象也序列化,就需要让父类也实现Serializable接口A、不要在代码中硬编码"\n"和"\r"作为换行符号,建议使用System.lineSeparator()方法获取运行时环境的换行符
B、编码时尽量依赖平台默认的字符编码方式
C、String类的toUpperCase()和toLowerCase()方法、format()方法,建议使用默认的编码模式进行转换
D、使用java.nio.charset中的类编码解码字符集防止未加密的敏感数据被序列的方法有