将压缩数据序列化为 JSON 会产生比未压缩数据更大的结果

Serialising compressed data to JSON produces a larger outcome than uncompressed

我有一些代码接受一个字符串,如果它超过给定的阈值,它就会压缩它。然后将结果序列化为 JSON 并转换为 Azure 服务总线消息对象。

问题是压缩版本比未压缩时更大。

// The original Payload.
string originalPayload = m.Payload;
int originalInBytes = Encoding.UTF8.GetByteCount(originalPayload); // 259122 bytes.
string originalSerialised = JsonConvert.SerializeObject(originalPayload);
int originalSerialisedInBytes = Encoding.UTF8.GetByteCount(originalSerialised); // 259182 bytes.

// The compressed Payload.
byte[] compressedPayload = _compressionService.Zip(m.Payload); // 195845 bytes. Reduced as expected.
string compressedSerialised = JsonConvert.SerializeObject(compressedPayload);
int compressedSerialisedInBytes = Encoding.UTF8.GetByteCount(compressedSerialised); // 261130 bytes. Greater than what we started with.

// Message created using the original payload. Message.Size = 259705.
m.Payload = originalPayload;
m.CompressedPayload = null;
Message origPayload = GetServiceBusMessage(m, delay, false, customProperties);

// Message created using the compressed payload. Message.Size = 261651.
m.Payload = string.Empty;
m.CompressedPayload = compressedPayload;
Message compPayload = GetServiceBusMessage(m, delay, false, customProperties);

bool working = origPayload.Size > compPayload.Size; // False. Should be true.

谁能告诉我是什么导致了这个问题?似乎是 SerializeObject 调用导致了差异,但我不清楚这是为什么。

首先,您不应期望压缩总是 减小大小。如果这总是正确的,您可以继续递归地应用压缩并最终得到一个空结果,该结果可以被解压缩为“任何东西”。

但真正的问题是你正在获取 JSON(本质上是文本),它以“任意二进制数据”结果结束,然后你将其序列化 - 任意二进制数据被序列化在 JSON 中作为 base64,将大小增加 1/3。 (每三个字节的数据最终变成base64的四个字符。)

鉴于您的压缩仅将大小减小了 ~1/4,总体结果是更大的 JSON 负载。除了期望之外,这里没有任何问题。