diff --git a/src/com/esotericsoftware/kryo/serializers/RecordSerializer.java b/src/com/esotericsoftware/kryo/serializers/RecordSerializer.java index 82b4da9b8..1a8e4e698 100644 --- a/src/com/esotericsoftware/kryo/serializers/RecordSerializer.java +++ b/src/com/esotericsoftware/kryo/serializers/RecordSerializer.java @@ -220,7 +220,13 @@ private static T invokeCanonicalConstructor (Class recordType, Class[] paramTypes = Arrays.stream(recordComponents) .map(RecordComponent::type) .toArray(Class[]::new); - Constructor canonicalConstructor = recordType.getConstructor(paramTypes); + Constructor canonicalConstructor; + try { + canonicalConstructor = recordType.getConstructor(paramTypes); + } catch (NoSuchMethodException e) { + canonicalConstructor = recordType.getDeclaredConstructor(paramTypes); + canonicalConstructor.setAccessible(true); + } return canonicalConstructor.newInstance(args); } catch (Throwable t) { KryoException ex = new KryoException(t); diff --git a/test-jdk14/com/esotericsoftware/kryo/serializers/RecordSerializerTest.java b/test-jdk14/com/esotericsoftware/kryo/serializers/RecordSerializerTest.java index 861c0f0d3..c509ef6bf 100644 --- a/test-jdk14/com/esotericsoftware/kryo/serializers/RecordSerializerTest.java +++ b/test-jdk14/com/esotericsoftware/kryo/serializers/RecordSerializerTest.java @@ -317,5 +317,16 @@ void testRecordWithSuperType() { roundTrip(3, r2); } + + static record PackagePrivateRecord(int i, String s) {} + private static record PrivateRecord(String s, int i) {} + @Test + void testNonPublicRecords() { + kryo.register(PackagePrivateRecord.class); + kryo.register(PrivateRecord.class); + + roundTrip(4, new PackagePrivateRecord(1, "s1")); + roundTrip(4, new PrivateRecord("s2",2)); + } }