Serialization problem
David M. Lloyd
david.lloyd at redhat.com
Mon Feb 1 16:10:00 UTC 2010
There is no need to deal with Unsafe for this. If you use a reflection
Field, while ugly, it *does* publish writes to a final field with volatile
semantics internally. I would argue that using a ThreadLocal in this
fashion would be far uglier.
There is another alternative. Use writeReplace to write a minimal
representation class, then use readResolve on that representation object to
transform it back again using standard constructors.
- DML
On 01/31/2010 02:50 PM, Stephen Colebourne wrote:
> Thanks for the info. Unfortunately, JSR-310 cannot use unsafe, as it
> needs to be usable outside the JDK.
>
> For info, I compared the sizes of a neatly trimmed output (using a
> Serialization proxy class) with the best achievable without one. 277
> bytes without, 99 bytes with a proxy. So, this isn't an esoteric
> problem.
>
> What would you think of using a ThreadLocal to cache the result value
> between readObject() and readResolve() ? (making everything transient
> and using a dedicated format)
>
> What do you think of the general idea of readObjectAndResolve() ? (for JDK 7+)
>
> Stephen
>
>
> On 31 January 2010 13:35, Alan Bateman<Alan.Bateman at sun.com> wrote:
>> Stephen Colebourne wrote:
>>>
>>> I thought I'd raise an issue with serialization that I've had a problem
>>> with more than once. Perhaps there is an obvious easy solution, but I can't
>>> see it (I can see hard workarounds...)
>>>
>>> In JSR-310 we have lots of immutable classes. One of these stores four
>>> fields:
>>>
>>> private final String name
>>> private final Duration duration
>>> private final List<PeriodField> periods
>>> private final int hashCode
>>>
>>> For serialization, I only need to store the name, duration and element
>>> zero from the periods list. (The rest of the period list is a cache derived
>>> from the first element. Similarly, I want to cache the hash code in the
>>> constructor as this could be performance critical.). Storing just these
>>> fields can be done easily using writeObject()
>>
>> In the JDK there are places that use unsafe's putObjectVolatile to
>> workaround this. It's also possible to use reflection hacks in some cases.
>> There is more discussion here:
>> http://bugs.sun.com/view_bug.do?bug_id=6379948
>>
>> Doug Lea and the concurrency group were working on a Fences API that
>> included a method for safe publication so that one can get the same effects
>> as final for cases where it's not possible to declare a field as field.
>>
>> For the hashCode case above then perhaps it doesn't necessary to compute the
>> hash code in the constructor or when reconstituting the object. Instead
>> perhaps the hashCode method could compute and set the hashCode field when it
>> sees the value is 0 (no need to be volatile and shouldn't matter if more
>> than one thread computes it).
>>
>> -Alan.
>>
>>
>>
More information about the core-libs-dev
mailing list