MST

星途 面试题库

面试题:Java反射机制下自定义对象序列化策略

假设你有一个复杂的Java对象,其中包含一些敏感信息,在使用反射机制的情况下,如何定制对象的序列化策略,确保敏感信息不会被序列化,同时又能保证对象的完整性可以在反序列化后恢复,给出具体实现思路及关键代码片段。
44.3万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. 实现思路
    • 利用Java的ObjectOutputStreamObjectInputStream进行对象的序列化和反序列化。
    • 对于敏感信息字段,使用transient关键字修饰,使其不被默认的序列化机制处理。
    • 通过反射机制,在序列化时手动处理非敏感字段,在反序列化时恢复对象状态。
    • 自定义writeObjectreadObject方法来控制序列化和反序列化过程。
  2. 关键代码片段
    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方法从流中读取加密后的敏感字段,解密后恢复对象状态。
    • encryptdecrypt方法是简单的示例,实际应用中应使用安全可靠的加密算法。