ldl-DeserializationViewer
一款強大的序列化數據可視化工具,能夠將Java序列化的緩存數據轉換為可讀的JSON格式,無需原始DTO類定義。
A powerful visualization tool for serialized data that converts Java serialized cache data to readable JSON format without requiring original DTO classes.
開源項目地址:https://gitee.com/luliang111222/ldl-DeserializationViewer
🤔 Why - 為什么需要這個工具
痛點問題
在實際開發和運維過程中,我們經常遇到以下問題:
- Redis數據不可讀:存儲在Redis中的Java序列化數據以二進制形式存在,無法直接查看內容
- 調試困難:排查緩存相關問題時,無法快速查看緩存對象的具體內容和結構
- 依賴缺失:生產環境中往往缺少原始的DTO類定義,傳統反序列化方法失效
- 版本兼容性:不同版本的serialVersionUID導致反序列化失敗
- 運維盲區:運維人員無法直觀了解緩存數據的業務含義
解決方案
ldl-DeserializationViewer 通過動態字節碼生成技術,實現了:
- ? 無依賴反序列化:無需原始DTO類,無需serialVersionUID
- ? 實時數據查看:直接將序列化數據轉換為JSON格式
- ? 多環境支持:支持開發、測試、生產等多環境配置
- ? 零侵入部署:既可以作為獨立工具,也可以集成到現有系統
📋 What - 這是什么工具
核心功能
🔍 序列化數據可視化
- 將Redis中的Java序列化字節數據轉換為可讀JSON
- 支持復雜對象結構的完整還原
- 自動處理基本數據類型和對象引用
🛠? 雙模式運行
- Web模式:Spring Boot + Swagger UI,提供友好的Web界面
- 命令行模式:獨立JAR包,支持腳本化操作
🏗? 智能類生成
- 基于Javassist和ASM的雙重字節碼生成引擎
- 動態創建類結構,完全兼容Java序列化規范
- 智能類型推斷和字段映射
🌐 多環境管理
- 支持預配置的環境切換(DEV/TEST/PROD)
- 靈活的Redis連接配置(單機/集群)
- 密碼認證和安全連接支持
技術架構
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ Web Interface │ │ Command Line │ │ Redis Cluster │
│ (Swagger UI) │ │ Tool │ │ / Standalone │
└─────────┬───────┘ └────────┬─────────┘ └─────────┬───────┘│ │ │└──────────┬──────────┘ ││ │┌──────────▼──────────┐ ││ DeserializationViewer │?──────────────────┘│ Business Logic │└──────────┬──────────┘│┌──────────▼──────────┐│ ByteCode Generator ││ ┌────────────────┐ ││ │ Javassist │ ││ └────────────────┘ ││ ┌────────────────┐ ││ │ ASM │ ││ └────────────────┘ │└─────────────────────┘
核心技術棧
- Spring Boot 2.3.3 - Web框架
- Jedis 2.9.0 - Redis客戶端
- Javassist 3.28.0 - 字節碼生成
- ASM 9.2 - 字節碼操作
- FastJSON 1.2.68 - JSON序列化
- Swagger 2.9.2 - API文檔
🚀 How - 如何使用
快速開始
1. 項目構建
# 克隆項目
git clone <repository-url>
cd ldl-DeserializationViewer# 編譯項目
mvn clean package
2. 配置環境
創建環境配置文件:
Windows: C:\Users\{username}\Desktop\hostconfig.properties
Linux: /data/cdp/read_redis/hostconfig.properties
配置格式:
# 環境名#Redis地址@密碼
DEV#127.0.0.1:6379@password123
TEST#192.168.1.100:6379
PROD#192.168.1.200:6379,192.168.1.201:6379@prodpass
使用方式
🌐 Web模式
-
啟用Spring Boot打包
<!-- 在pom.xml中啟用 --> <plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId> </plugin>
-
啟動服務
java -jar deserialization-viewer-0.0.1-SNAPSHOT.jar &
-
訪問界面
http://localhost:8087/deserialization/swagger-ui.html
-
API使用
根據主機查詢:
- 接口:
GET /search
- 參數:
ipAndPort
,password
(可選),key
- 示例:
/search?ipAndPort=127.0.0.1:6379&key=user:1001
根據環境查詢:
- 接口:
GET /searchByEnv
- 參數:
envName
,key
- 示例:
/searchByEnv?envName=TEST&key=user:1001
- 接口:
💻 命令行模式
-
啟用命令行打包
<!-- 在pom.xml中啟用 --> <plugin><artifactId>maven-assembly-plugin</artifactId> </plugin>
-
直接IP訪問
java -jar deserialization-viewer-0.0.1-SNAPSHOT-jar-with-dependencies.jar \192.168.1.100:6379@password123 user:1001
-
環境配置訪問
java -jar deserialization-viewer-0.0.1-SNAPSHOT-jar-with-dependencies.jar \TEST user:1001
輸出示例
{"success": true,"data": {"userId": 1001,"userName": "張三","email": "zhangsan@example.com","createTime": "2024-01-15T10:30:00","profile": {"age": 28,"city": "北京","interests": ["編程", "閱讀", "旅行"]}},"message": null
}
高級配置
應用配置 (application.properties
)
# 服務配置
spring.application.name=DeserializationViewer
server.port=8087
server.servlet.context-path=/deserialization# 環境配置
env.names=dev,test,product
host.config.windows=C:\\Users\\config\\hostconfig.properties
host.config.linux=/data/config/hostconfig.properties
集群Redis支持
# 集群地址用逗號分隔
CLUSTER#192.168.1.100:7000,192.168.1.101:7000,192.168.1.102:7000@clusterpass
故障排除
常見問題
-
類加載失敗
問題:自定義加載失敗 com.example.UserDTO 解決:檢查序列化數據完整性,確認Redis連接正常
-
配置文件未找到
問題:配置文件讀取失敗 解決:確認hostconfig.properties路徑正確,文件格式符合要求
-
Redis連接失敗
問題:查詢redis失敗 解決:檢查網絡連接、Redis服務狀態、密碼配置
日志配置
項目使用Log4j2,可通過log4j2-spring.xml
調整日志級別:
<Logger name="com.datalight.tools.deserialization" level="DEBUG"/>
📊 性能特性
- 零依賴反序列化:無需原始類定義
- 內存高效:流式處理,支持大對象
- 并發安全:無狀態設計,支持多線程訪問
- 錯誤降級:反序列化失敗時返回原始字符串
🤝 貢獻指南
- Fork 本倉庫
- 創建特性分支:
git checkout -b feature/AmazingFeature
- 提交更改:
git commit -m 'Add some AmazingFeature'
- 推送分支:
git push origin feature/AmazingFeature
- 提交Pull Request
📄 許可證
本項目基于 LICENSE 許可證開源。
💡 技術原理
動態類生成原理
- 解析
ObjectStreamClass
獲取類元信息 - 使用Javassist/ASM動態生成字節碼
- 創建自定義ClassLoader加載生成的類
- 通過標準Java序列化API完成反序列化
兼容性保證
- 支持JDK 1.8+
- 兼容Redis 2.x - 6.x
- 支持Spring Boot 2.x
開源項目地址:https://gitee.com/luliang111222/ldl-DeserializationViewer
讓緩存中的序列化數據不再是黑盒! 🎯