{"record":{"id":"3d7b4b771db7b402","repo":"apple/pkl","slug":"expected-3-fields-in-object-member-found-d","errorCode":null,"errorMessage":"Expected 3 fields in object member, found %d","messagePattern":"Expected 3 fields in object member, found (.+?)","errorType":"validation","errorClass":"DecodeException","httpStatus":null,"severity":"error","filePath":"pkl-core/src/main/java/org/pkl/core/util/pklbinary/AbstractPklBinaryDecoder.java","lineNumber":430,"sourceCode":"        currPath.pop();\n        idx++;\n      }\n    }\n\n    abstract T getNext() throws IOException;\n  }\n\n  protected class ObjectDecodeIterator extends DecodeIterator<DecodedObjectMember> {\n    ObjectDecodeIterator(int size) {\n      super(size);\n      checkCollectionLength(size, \"object\");\n    }\n\n    @Override\n    DecodedObjectMember getNext() throws IOException {\n      var memberLen = unpacker.unpackArrayHeader();\n      if (memberLen != 3) {\n        throw new DecodeException(\"Expected 3 fields in object member, found %d\", memberLen);\n      }\n      var memberCodeInt = unpacker.unpackInt();\n      var memberCode = PklBinaryCode.fromInt(memberCodeInt);\n      if (memberCode == null) {\n        throw new DecodeException(\"Unrecognized code 0x%x\", (byte) memberCodeInt);\n      }\n      DecodedObjectMember member;\n      switch (memberCode) {\n        case PROPERTY -> {\n          var propertyName = unpacker.unpackString();\n          currPath.push(propertyName);\n          member = new DecodedObjectMember(memberCode, propertyName, doDecode());\n        }\n        case ENTRY -> {\n          var entryKey = doDecode();\n          currPath.push(entryKey);\n          member = new DecodedObjectMember(memberCode, entryKey, doDecode());\n        }","sourceCodeStart":412,"sourceCodeEnd":448,"githubUrl":"https://github.com/apple/pkl/blob/f3efcbfc9b60d30053b0536d664948d7aa1b8673/pkl-core/src/main/java/org/pkl/core/util/pklbinary/AbstractPklBinaryDecoder.java#L412-L448","documentation":"Thrown by getNext (the object-member iterator) when an object member array in the Pkl binary payload does not contain exactly 3 fields (member code plus the fields identifying the member). The binary format mandates 3 fields per member, so any other count means the payload structure is invalid or was produced by an incompatible encoder.","triggerScenarios":"Decoding pkl-binary bytes where an object's members array contains 2-element or 4-element member arrays; an encoder version with a different member layout; corrupted headers changing the declared array length.","commonSituations":"Producer and consumer using different Pkl versions with changed OBJECT member encoding; hand-crafted payloads; truncation corrupting the member array header.","solutions":["Re-encode the payload with the Pkl version matching the decoder","Inspect the member array header in the payload and fix the encoder to pack exactly 3 fields per member","Verify the file is not truncated or otherwise corrupted","Pin encoder and decoder to the same Pkl version in your build/deployment"],"exampleFix":"// before\npacker.packArrayHeader(2);\npacker.packInt(code);\npacker.packString(name);\n// after\npacker.packArrayHeader(3);\npacker.packInt(code);\npacker.packString(name);\npacker.packValue(value);","handlingStrategy":"try-catch","validationCode":"// pre-decode sanity check: walk object members and assert each has a 3-field array header\nvar it = new MessagePackUnpacker(new ByteArrayInputStream(bytes));\n// skip to object members; for each: if (unpacker.unpackArrayHeader() != 3) fail();","typeGuard":null,"tryCatchPattern":"try {\n  return decoder.decode(bytes);\n} catch (DecodeException e) {\n  if (e.getMessage().startsWith(\"Expected 3 fields in object member\")) {\n    throw new IncompatiblePklBinaryVersionException(e);\n  }\n  throw e;\n}","preventionTips":["Pin encoder and decoder to the same Pkl version","Pack exactly 3 fields per object member (code, key/name info, value)","Round-trip test payloads across every producer upgrade","Reject or re-fetch truncated/corrupted files before decoding"],"tags":["pkl","binary-decoder","corrupt-payload","malformed-input"],"backgroundTag":"schema-validation-failed","analyzedSha":"f3efcbfc9b60d30053b0536d664948d7aa1b8673","analyzedAt":"2026-09-08T13:10:45.570Z","contentChangedAt":"2026-09-08T13:10:45.570Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}