Scott,
From: "Scott Gray" <scott.g...@hotwaxmedia.com>
Hi Jacques,
I'm not going to sit here and pretend to be some sort of expert on the
subject, I was merely correcting a statement which I knew
to be false.
I was not false but badly expressed :p. I wanted to speak about the peculiar
case of versionning with serialisation (actually that
what serialVersionUID is all about).
Because it's the only case that may introduce an issue. The implicit mechanism
should work in most cases but is not guaranteed[1][2]
That said, it is my understanding that java serialization always uses
versioning on objects that implement the Serializable
interface, the only choice is whether it is implicit (done by the compiler) or
explicit (hand coded or autogenerated by an IDE).
The discussion in hand is about what that choice should be implicit or
explicit, with both options appearing to have some
downsides. In regards to that decision I really have nothing of value to add
:-)
I agree with David, let the compiler deals with it and if someone has a real need then she/he should use serialVersionUID in her/his
code.
So I'd prefer to put @SuppressWarnings("serial") everywhere (even in the
cases I reported serialVersionUID is currently used ) and
forget about it
I learnt one thing : Runtime computation of the serial version UID hash is
expensive in terms of performance
One question remains : should we continue to "support"(include) Shark ?
Jacques
[1]<<As a general rule, it's always a good idea to declare explicit serial
version UID values for serializable classes. There are
two reasons for doing that:
a.. Runtime computation of the serial version UID hash is expensive in terms
of performance. If you don't declare a serial version
UID value, then serialization must do it for you at runtime.
b.. The default serial version UID computation algorithm is extremely
sensitive to class changes, including those that might
result from legal differences in compiler implementations. For instance, a
given serializable nested class might have different
default serial version UID values depending on which javac was used to compile
it. That's because javac must add synthetic class
members to implement nested classes, and differences in these synthetic class
members are picked up by the serial version UID
calculation. >>
c.. http://java.sun.com/developer/JDCTechTips/2001/tt0306.html
[2] http://en.wikipedia.org/wiki/Serialization#cite_ref-2
Regards
Scott
On 5/11/2009, at 7:49 PM, Jacques Le Roux wrote:
Hi Scott,
Actually I did not well express myself yesterday night. I was speaking about
serialisation *and* versionning.
As Bob explained, we don't need to put serialVersionUIDs as long as we are not
concerned by versionning.
BTW, the only places we currently have serialVersionUIDs are
AuthenticatorException and a bunch in Shark (BTW I wonder if we
should keep Shark in OFBiz ?)
I wonder if in RMI, session replication and session persistence will ever
use versionning ? I mean you use it in a context
where you will not change classes and compile, isn'it ?
Now I wonder how you envision to use serialisation versionning with runtime
data for persisted services. Could you elaborate
please ?
Anyway all above is not really related with @SuppressWarnings("serial") which
is only a convenient way to hide a warning and
does not block any future uses of serialisation versionning.
Jacques
From: "Jacques Le Roux" <jacques.le.r...@les7arts.com>
Ha yes, I forgot about RMI and session replication, thanks Scott.
So this introduce san uncertainty about using @SuppressWarnings("serial") or
not because you have to consider how the class
will be used.
Maybe we should stay as we were and not put this annotation anywhere or very
carefully ?
For instance in the POS I don't expect any uses of RMI nor any points Scott's
outlined below, so I guess it's safe there.
And anway in case we need serialisation we can always remove the annotation
and seralise isn'it ?
Jacques
From: "Scott Gray" <scott.g...@hotwaxmedia.com>
FYI Jacques, we do use serialization and will in the future, RMI, session
replication, session persistence, runtime data for
persisted services, etc.
Regards
Scott
HotWax Media
http://www.hotwaxmedia.com
On 5/11/2009, at 11:43 AM, Jacques Le Roux wrote:
KISS : my opinion is that we don't use serialisation and should not in the future, so
@SuppressWarnings("serial") seems good
to me.
And I always remember being badly biteen by serialisation in Visual C ++ 10
years ago
When changing fields (adding or removing can't remember), it worked for
objects alone, but not when these objects were in a
CMap and you wanted to serialise all (list+its objects)
Jacques
From: "Bob Morley" <rmor...@emforium.com>
I do not disagree with the overall premise.
However, I believe that there is no "compiler handling" in this case. My
understanding (and I stand to be corrected) is that if we were to serialize
an object, have a new field added, and then attempt to deserialize it, it
will always throw an exception if we have not specified the serial number.
(I believe at runtime it will use reflection, determine the class definition
has changed, and throw the exception).
Contrast this to having a serial number on the class, where new fields (in
the same scenario) would be effectively ignored but the object would be
successfully deserialized.
Having said this, my guess is that we do not do much of this (perhaps job
sandbox?) so it might be much to do about nothing. I was more curious if
there was a discussion / lots of thought put into not specifying a serial
number and using the warning suppression.
Personally, I have no vested interest in doing it one way or another. I am
really looking for the best practice as I go through and clean- up other
warnings in the source code. Since our internal process has been to
generate the serial number, I thought it would be good to have a quick
dialog and see if we are doing the right thing or if we should make a
change.
David E Jones-4 wrote:
In this and in general I prefer not to manually or personally control
things that I know I am likely to mess up. In other words, I think
this is one case where it is likely that we will often forget to
update manual serial UIDs, even if some IDEs help with it.
I may be missing something, but isn't this better to let the compiler
handle?
-David
On Nov 3, 2009, at 8:24 AM, Bob Morley wrote:
Wondering if it makes sense for the best practice for serialized
classes to a
generated serial number instead of just suppressing the warning?
Currently
in Ofbiz there are lots of examples of the suppression in place but
only one
generated serial number
(org.ofbiz.common.authentication.api.AuthenticatorException).
My brief understanding is that Java will make use of the generated
serialVersionUID when it is determining if the definition of a class
has
changed for deserialization rather than using reflection.
We have been working on cleaning up warnings in the source code and
this is
one that I am just now considering for clean-up.
Thoughts?
--
View this message in context:
http://n4.nabble.com/Usage-of-SuppressWarnings-serial-tp361041p361041.html
Sent from the OFBiz - Dev mailing list archive at Nabble.com.
--
View this message in context:
http://n4.nabble.com/Usage-of-SuppressWarnings-serial-tp361041p361091.html
Sent from the OFBiz - Dev mailing list archive at Nabble.com.