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

  1. Use canonical Pkl DataSize unit strings (lowercase b/kb/mb/... /kib/mib/...) in the encoder
  2. Normalize unit names at the producer before packing
  3. Regenerate the payload with the official Pkl encoder
  4. 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

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


AI-assisted analysis of apple/pkl@f3efcbfc9b (2026-09-08). Data as JSON: /api/errors/8be1a11df8a4fda0. Report an issue: GitHub.