On 03/25/2015 04:58 PM, Chris Hegarty wrote:

On 25 Mar 2015, at 17:32, Peter Levart <[email protected]> wrote:

On 03/25/2015 05:55 PM, Peter Levart wrote:
On 03/25/2015 04:49 PM, Chris Hegarty wrote:
I have been thinking about this and I see several solutions:

1. provide protected final methods
ObjectInputStream.checkPersistentFinalsNotSet() and
markPersistentFinalsSet() that just delegate to FieldSetterContext for
ObjectInputStream classes to call as part of their own overriden
defaultReadObject() method. We should make sure those methods are called
in JDK's corba InputStreamHook and document they should be called in 3rd
party subclasses.

Yes, I think I agree with this, but since the FieldSetterContext is constructed 
in OIS private readSerialData, there is nothing to delegate to, unless 
InputStreamHook/IIOPInputStream creates the context.

Ah, I see. Let me look at this in some more detail...

Regards, Peter


Huh, this is tricky! IIOPInputStream does invoke readObject/writeObject methods 
on an object being (de)serialized, but it does it on it's own. So any classes 
using FieldSetter API will get an exception when attempted deserialization with 
corba…

It will get NotActiveException, thinking that it is not in a readObject callback 
<sigh>.

We could fix IIOPInputStream to do the right thing at the right time (like 
ObjectInputStream) and provide a FieldSetter instance, but what about any 3rd 
party ObjectInputStream subclasses that might do the same? Suddenly classes 
using FieldSetter API will become incompatible with 3rd party OIS 
implementations until those implementations catch-up.

Yeap.

Providing a factory for FieldSetter instance to subclasses of OIS is giving 
write access to private fields of any object. Would have to be protected by 
some permission. Is this acceptable?

I think it needs to be protected by more than a permission check. The nice 
thing about the FieldSetter API as it stands ( before this ) is that it is only 
possible to set final fields during deserialization. I am reluctant about 
exposing this API further. Whatever changes we make should keep this property.

I’m looking at your previous suggestions, and giving this some thought. Nothing 
jumping out yet.

I think this is a sign that this extra check isn't really appropriate, or maybe isn't in the appropriate place. Having a run time check here is just "weird", for lack of a better word, given that the equivalent constructor check is compile-time. The author of a class can already determine whether they are setting all the fields they want to set; it's not like there's generally going to be a confluence of multiple players contributing to the set of final fields, or some other complex situation like that.

Put another way - the FieldSetter API doesn't *need* this extra check in order to justify its existence, especially given these complications. If we're just looking for something to replace using reflection to hack in final field values, then just having a proper API to do it is already enough of an improvement in my mind that I believe that the extra check can (and should) be considered as a separate enhancement on top of it, if it *must* be considered at all.

--
- DML

Reply via email to