apple/pkl · error · DecodeException
Invalid DataSize unit `%s`
Error message
Invalid DataSize unit `%s`
What it means
Thrown by decodeDataSize when a DATASIZE entry's unit string cannot be parsed by DataSizeUnit.parse. Pkl data sizes only accept canonical units (b, kb, mb, gb, tb, pb, kib, mib, gib, tib, pib); anything else makes the payload invalid.
Source
Thrown at pkl-core/src/main/java/org/pkl/core/util/pklbinary/AbstractPklBinaryDecoder.java:285
var rawDurationUnit = unpacker.unpackString();
var durationUnit = DurationUnit.parse(rawDurationUnit);
if (durationUnit == null) {
throw new DecodeException("Invalid Duration unit `%s`", rawDurationUnit);
}
var result = doDecodeDuration(durationValue, durationUnit);
unpacker.skipValue(len - 3);
currPath.pop();
return result;
}
private Object decodeDataSize(int len) throws IOException {
assertLength(PklBinaryCode.DATASIZE, len, 2);
currPath.push("'datasize");
var dataSizeValue = unpacker.unpackDouble();
var rawDataSizeUnit = unpacker.unpackString();
var dataSizeUnit = DataSizeUnit.parse(rawDataSizeUnit);
if (dataSizeUnit == null) {
throw new DecodeException("Invalid DataSize unit `%s`", rawDataSizeUnit);
}
var result = doDecodeDataSize(dataSizeValue, dataSizeUnit);
unpacker.skipValue(len - 3);
currPath.pop();
return result;
}
private Object decodePair(int len) throws IOException {
assertLength(PklBinaryCode.PAIR, len, 2);
currPath.push("'pair");
currPath.push("'first");
var first = doDecode();
currPath.pop();
currPath.push("'second");
var second = doDecode();
currPath.pop();
var result = doDecodePair(first, second);
unpacker.skipValue(len - 3);View on GitHub (pinned to f3efcbfc9b)
Solutions
- Use canonical Pkl DataSize unit strings (lowercase b/kb/mb/... /kib/mib/...) in the encoder
- Normalize unit names at the producer before packing
- Regenerate the payload with the official Pkl encoder
- Check the raw string logged in the message and fix the producer mapping
Example fix
// before
packer.packString("KB");
// after
packer.packString("kb"); Defensive patterns
Strategy: validation
Validate before calling
Set<String> VALID = Set.of("b","kb","mb","gb","tb","pb","kib","mib","gib","tib","pib");
if (!VALID.contains(unit)) throw new IllegalArgumentException("bad datasize unit: " + unit); Try / catch
try {
return decoder.decode(bytes);
} catch (DecodeException e) {
if (e.getMessage().contains("Invalid DataSize unit")) {
throw new MalformedPklBinaryException(e);
}
throw e;
} Prevention
- Use lowercase canonical DataSize units in binary payloads
- Avoid display formatting (e.g. "KB", "MiB") at the encoder boundary
- Round-trip test all units
- Validate units before packing
When it happens
Trigger: Decoding pkl-binary bytes where a DATASIZE entry has a unit like "kilobytes", "KB", or an empty string; a custom encoder writing non-canonical or wrongly-cased unit names.
Common situations: Encoders emitting display-style unit names; hand-edited binary fixtures; case-sensitivity mismatches when a producer upper-cases units.
Related errors
- Invalid Duration unit `%s`
- Cannot convert String `%s` to Enum value of type `%s`.
- value
- Invalid DataSize unit symbol:
- double
AI-assisted analysis of apple/pkl@f3efcbfc9b (2026-09-08).
Data as JSON: /api/errors/8be1a11df8a4fda0.
Report an issue: GitHub.