final transient fields serialization

Tom Hawtin Thomas.Hawtin at Sun.COM
Thu Dec 3 10:57:28 UTC 2009


Peter Jones wrote:

> Regarding a language solution, though, I don't see how to avoid making a 
> [...]

`readObject` is a `psuedo-constructor`. Ideally it would be a real 
constructor (with choice of defaultReadObject/readFields similar to 
super), but that would require significant changes to the JLS.

Similar problems appear for JAXB, ORMs, etc. Dependency Inject also has 
problems with construction. Construction often involves way too much 
boilerplate. There are lots of issues here, most I have little 
experience with.

> So I think that the best hope is an improved reflective library 
> solution.  Thinking out loud: say, a factory method that looks up a 
> [...]

I guess something like

class MyClass implements Serializable {
     private final transient Thing thing;
     private static final FieldRead<Thing> THING_READER =
         FieldRead.newInstance("thing");
     ...
     private void readObject(...) ... {
         in.defaultReadObject();
         Thing thing = (Thing)in.readObject();
         THING_READER.set(thing);
     }
}

Gratuitous use of immediate caller. I just know people will attempt to 
take client supplied arguments. Best we can do is put a few static 
checks in javac and static analysis tools, and runtime checks into the 
serialisation mechanism.

(Notes:
    FieldRead.newInstance
      - must be called by static initialiser
          (dynamic and perhaps static check).
      - static analysis (inc. javac) can check field name, type and 
assignment).
      - errors by unchecked exception
    FieldRead.read
      - Dynamic check that called from readObject on this instance (can 
cheat).
      - Dynamic check for no reassignment.
      - Dynamic check after readObject call for definite assignment.
      - Could also add static checks as well.
)

Tom Hawtin



More information about the core-libs-dev mailing list