use super::Serializer;
use super::utils::{check_data_size, compress_data, decompress_data_with_limit};
use crate::core::MAX_JSON_SIZE;
use crate::error::OxCacheResult;
#[derive(Clone, Debug)]
pub struct JsonSerializer {
compress: bool,
}
impl JsonSerializer {
pub fn new() -> Self {
Self { compress: false }
}
pub fn with_compression() -> Self {
Self { compress: true }
}
}
impl Default for JsonSerializer {
fn default() -> Self {
Self::new()
}
}
impl Serializer for JsonSerializer {
fn serialize(&self, _type_name: &str, data: &[u8]) -> OxCacheResult<Vec<u8>> {
if self.compress {
compress_data(data)
} else {
Ok(data.to_vec())
}
}
fn deserialize(&self, _type_name: &str, data: &[u8]) -> OxCacheResult<Vec<u8>> {
check_data_size(data, MAX_JSON_SIZE, "JSON")?;
if self.compress {
decompress_data_with_limit(data, super::utils::MAX_DECOMPRESS_SIZE)
} else {
Ok(data.to_vec())
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_raw_bytes_round_trip() {
let serializer = JsonSerializer::new();
let data = vec![0, 1, 2, 255, 254, 253];
let serialized = serializer.serialize("test", &data).unwrap();
assert_eq!(serialized, data);
let deserialized = serializer.deserialize("test", &serialized).unwrap();
assert_eq!(data, deserialized);
}
#[test]
fn test_raw_bytes_not_base64_encoded() {
let serializer = JsonSerializer::new();
let data = vec![0, 1, 2, 255, 254, 253];
let serialized = serializer.serialize("test", &data).unwrap();
assert_eq!(serialized.len(), data.len(), "不应有 base64 膨胀 (4/3)");
}
#[test]
fn test_compression() {
let serializer = JsonSerializer::with_compression();
let data = vec![0u8; 1000];
let serialized = serializer.serialize("test", &data).unwrap();
let deserialized = serializer.deserialize("test", &serialized).unwrap();
assert_eq!(data, deserialized);
}
#[test]
fn test_empty_bytes() {
let serializer = JsonSerializer::new();
let data: Vec<u8> = vec![];
let serialized = serializer.serialize("test", &data).unwrap();
let deserialized = serializer.deserialize("test", &serialized).unwrap();
assert_eq!(data, deserialized);
}
#[test]
fn test_max_size_limit() {
let serializer = JsonSerializer::new();
let large_data = vec![0u8; MAX_JSON_SIZE + 1];
let result = serializer.deserialize("test", &large_data);
assert!(result.is_err());
}
}