【Easylive】项目常见问题解答(自用&持续更新中…) 汇总版
这段代码定义了一个名为 TokenUserInfoDto
的 DTO(数据传输对象),用于封装用户令牌信息。以下是对 @JsonIgnoreProperties
和 Serializable
接口作用的详细解释:
1. @JsonIgnoreProperties(ignoreUnknown = true)
作用
• 这是 Jackson 库 提供的注解,用于控制 JSON 序列化/反序列化时的行为。
• ignoreUnknown = true
表示:当 JSON 字符串中包含 DTO 类中没有的字段时,忽略这些字段而不报错。
为什么需要它?
• 场景:如果后端接收的 JSON 数据比 DTO 的字段多(例如前端传了 extraField
,但 DTO 未定义该字段),默认情况下 Jackson 会抛出 UnrecognizedPropertyException
。
• 解决:添加此注解后,多余的字段会被静默忽略,确保反序列化不会因字段不匹配而失败。
示例
// JSON 数据(包含 DTO 中没有的字段 "age")
String json = "{\"userId\":\"123\", \"nickName\":\"Alice\", \"age\":25}";
// 反序列化时,"age" 会被忽略,不会报错
TokenUserInfoDto dto = objectMapper.readValue(json, TokenUserInfoDto.class);
2. implements Serializable
作用
• 标记该类为可序列化的,表示该类的对象可以被转换为字节流(例如存储到文件、通过网络传输或存入 Redis 等缓存)。
• 需要定义一个 serialVersionUID
字段作为版本控制标识符。
为什么需要它?
- 网络传输:
• 在 RPC(如 Dubbo)或分布式系统中,对象需要跨 JVM 传输,必须实现Serializable
。 - 持久化存储:
• 将对象保存到磁盘或数据库(如 Redis 的value
需要实现序列化)。 - 兼容性:
•serialVersionUID
用于验证序列化和反序列化的类是否兼容(如果类结构变更但未更新 UID,会抛出InvalidClassException
)。
示例
// 序列化对象到字节数组
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(dto);
byte[] bytes = bos.toByteArray();
// 从字节数组反序列化
ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
ObjectInputStream ois = new ObjectInputStream(bis);
TokenUserInfoDto deserializedDto = (TokenUserInfoDto) ois.readObject();
3. 其他代码说明
• 字段含义:
• userId
:用户唯一标识。
• nickName
:用户昵称。
• avatar
:用户头像 URL。
• expireAt
:令牌过期时间(时间戳)。
• token
:用户认证令牌(如 JWT)。
• Getter/Setter:
提供标准的 Java Bean 方法,便于框架(如 Spring、Jackson)通过反射访问字段。
总结
特性 | 作用 | 使用场景 |
---|---|---|
@JsonIgnoreProperties(ignoreUnknown = true) | 忽略 JSON 中的未知字段 | 防止前端多传字段导致反序列化失败 |
implements Serializable | 支持对象序列化 | 网络传输、缓存存储、RPC 调用 |
serialVersionUID | 版本控制 | 确保序列化兼容性 |
实际应用场景:
• 该 DTO 可能用于用户登录后返回的令牌信息(通过 JSON 响应给前端)。
• 也可能被序列化后存入 Redis(作为缓存或分布式会话)。