> On 11 Jun 2024, at 17:27, David Lloyd <david.ll...@redhat.com> wrote: > > > > On Tue, Jun 11, 2024 at 10:17 AM Alan Bateman <alan.bate...@oracle.com> wrote: > On 06/06/2024 18:37, David Lloyd wrote: >> Just bumping this one more time. I intend to start by opening a JIRA to add >> the two proposed methods to `ReflectionFactory`, and go from there. I guess >> that we might need a JEP for the proposed serialization restrictions, which >> is going to be considerably more involved, so I'm putting that off as a >> second step for now, pending further discussion. >> > > I don't think the JDK should be adding another backdoor for serialization > libs to do deep reflection. > > I'm curious, does your serialization library uses the ReflectionFactory to > get method handles to the readObject/writeObject methods (if they are > defined)? > > Yes, all of the method-access methods on ReflectionFactory are used, not just > for readObject/writeObject but also readObjectNoData, readResolve, and > writeReplace, the constructor accessors, and the factory methods for > OptionalDataException. We don't use the static initializer one though (maybe > the ORB does, I'm not sure). > > -- > - DML • he/him
Ok, good. So the way the JDK’s built-in serialization mechanism allows custom implementation is by extending ObjectInputStream/ObjectOutputStream (and to that purpose it offers protected constructors of those two classes). ReflectionFactory offers access to non-public readObject/writeObject methods, but it does not currently offer a way to exploit the default field-based reflection when such methods are not explicitly declared. Given that, I think that an appropriate mechanism to consider is having ReflectionFactory offer access to MethodHandles that can perform de/serialization using the default JDK field-based serialization, but still requiring the serialization library to extend ObjectInputStream/ObjectOutputStream — i.e. those MethodHandles will invoke the appropriate OIS/OOS methods for writing fields — but not offering any direct access to non-public fields. This would still be an interim mechanism, and it may still require significant work by serialization libraries that don’t wish to offer custom serializers for JDK classes and don’t wish to use --add-opens. Looking further ahead, a future JDK mechanism to support custom serialization would still be based on invoking public constructors. I.e., the same effect could be achieved today — albeit with some more work — by the serialization library offering custom serializers for JDK classes that invoke their public constructors (the difference being that such a future mechanism would make it easier to automatically identify the public constructor to be invoked, whereas today it would need to be individually determined on a per-class basis). Serialization libraries that want to be better prepared for that future and not do further significant work when it arrives, should use custom serializers for JDK classes that invoke public constructors rather than rely on the mechanism I proposed above or on --add-opens. Whatever they choose to do, to assist in forming some future JDK mechanism that could support custom serialization, serialization libraries should report which JDK classes they commonly serialize and what public constructors they are missing, if any. — Ron