> De: "Chris Hegarty" <chris.hega...@oracle.com> > À: "Remi Forax" <fo...@univ-mlv.fr> > Cc: "amber-spec-experts" <amber-spec-experts@openjdk.java.net>, "amber-dev" > <amber-...@openjdk.java.net> > Envoyé: Dimanche 28 Février 2021 17:42:41 > Objet: Re: Deserialization of a linked list of records
> [resending; in an effort to produce a less garbled version] > Remi, >>> On 26 Feb 2021, at 22:06, Remi Forax < [ mailto:fo...@univ-mlv.fr | >> > fo...@univ-mlv.fr ] > wrote: >>>[sent to both email list given it's not clear if it's an implementation >>>issue or >> >a spec issue] >>>There is a nice video of how the serialization of records works recently on >> >inside.java >>> [ https://inside.java/2021/02/23/records-met-serialization/ | >> > https://inside.java/2021/02/23/records-met-serialization/ ] > Yes, this is a nice explanation of how record serialization works. >>> In the video, Julia explains that the de-serialization works from >>> bottom-up, so >> > what if the record instances are a linked list … >> > answer: a stack overflow. > This reproducer fails on my machine with a StackOveflowException when > serializing ( not de-serializing ). > It fails with: > Exception in thread "main" java.lang.StackOverflowError > at > java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1142) > at > java.base/java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1577) > at > java.base/java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1534) > at > java.base/java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1443) > at > java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1186) > at > java.base/java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1577) > at > java.base/java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1534) > at > java.base/java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1443) > at > java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1186) > at > java.base/java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1577) > at > java.base/java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1534) > at > java.base/java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1443) > at > java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1186) > at > java.base/java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1577) > ... > The same is true if Link is a normal class ( not a record class ). oops, yes, you are right ! > Records and normal classes share the same code path in OOS when serializing. exact, i now remember that i have reviewed the code that introduces the serialization of records, sorry for the noise. > -Chris. Rémi