面试题答案
一键面试- 实现思路:
- 利用Java的
ObjectOutputStream
和ObjectInputStream
进行对象的序列化和反序列化。 - 对于敏感信息字段,使用
transient
关键字修饰,使其不被默认的序列化机制处理。 - 通过反射机制,在序列化时手动处理非敏感字段,在反序列化时恢复对象状态。
- 自定义
writeObject
和readObject
方法来控制序列化和反序列化过程。
- 利用Java的
- 关键代码片段:
import java.io.*; import java.lang.reflect.Field; public class SensitiveObject implements Serializable { // 非敏感字段 private String normalField = "Normal data"; // 敏感字段,使用transient修饰 private transient String sensitiveField = "Sensitive data"; // 自定义序列化方法 private void writeObject(ObjectOutputStream out) throws IOException { out.defaultWriteObject(); try { Field sensitiveField = getClass().getDeclaredField("sensitiveField"); sensitiveField.setAccessible(true); // 这里可以对敏感字段进行特殊处理,比如加密后写入 String encryptedSensitiveField = encrypt((String)sensitiveField.get(this)); out.writeObject(encryptedSensitiveField); } catch (NoSuchFieldException | IllegalAccessException e) { e.printStackTrace(); } } // 自定义反序列化方法 private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { in.defaultReadObject(); try { Field sensitiveField = getClass().getDeclaredField("sensitiveField"); sensitiveField.setAccessible(true); String encryptedSensitiveField = (String)in.readObject(); // 这里进行解密恢复敏感字段 String decryptedSensitiveField = decrypt(encryptedSensitiveField); sensitiveField.set(this, decryptedSensitiveField); } catch (NoSuchFieldException | IllegalAccessException e) { e.printStackTrace(); } } private String encrypt(String data) { // 简单示例,实际应使用安全的加密算法 return new StringBuilder(data).reverse().toString(); } private String decrypt(String data) { // 简单示例,实际应与加密算法对应 return new StringBuilder(data).reverse().toString(); } }
- 在上述代码中,
SensitiveObject
类实现了Serializable
接口。敏感字段sensitiveField
被声明为transient
,避免默认序列化。 writeObject
方法通过反射获取敏感字段,进行加密后写入流。readObject
方法从流中读取加密后的敏感字段,解密后恢复对象状态。encrypt
和decrypt
方法是简单的示例,实际应用中应使用安全可靠的加密算法。
- 在上述代码中,