If you are Serializing
objects you have to learn about the serialVersionUID. It is a 64-bit value that
Java's object serialization facility uses to determine whether a serialized
object instance is compatiable with the local class of the same name. Every
serialized object has one whether you specify it or not. But, you should always
specify it. Otherwise practically any change to the class will result in a
java.io.InvalidClassException when trying to read (unmarshall) a persisted
instantance of the previous version of the class. Furthermore if you don't
specify one, the JVM will compute it on the fly; since this is a expensive
computation it significantly degrades the serialization performance.
You
should get in the habit of always including the following class
variable to each class that is Serializable.
private static final long serialVersionUID =
-7506063353335561975L;
Where the above number is found using the
java tool "serialver -show" (make sure your classpath is set correctly before
running it). It is also printed in the java.io.InvalidClassException if the
persisted instance being read is not compatiable with the local
class.
Note: if serialver is running while you are making changes to a
class, exit serialver and restart it after you made your last change to the
class and compiled it. Since, serialver loads the class only once, if you don't
restart it will compute serialVersionUID on the original
class.
Tom
Jordan
-----Original Message-----
From: Zlatko
Kostadinov [mailto:[EMAIL PROTECTED]]
Sent:
Monday, August 26, 2002 7:52 AM
To: JDJList
Subject: [jdjlist] Re: AW:
problem with serizlization
Yes - this is good desicion.
Thanks!
But I already have searialized objects - I forgot to put the version
field,
although I had seen this method already :-((
----- Original
Message -----
From: "Lesden, Kim" <[EMAIL PROTECTED]>
To: "JDJList"
<[EMAIL PROTECTED]>
Sent: Monday, August 26, 2002 2:45
PM
Subject: [jdjlist] AW: problem with serizlization
> Hello
Zlatko,
>
> a simple way would be to store a version attribute
before you store
anything else. That way you can also easily migrate old data
on the fly. I
have seen this work very well in C++. However, if you have lots
of data and
complex version migrations (v1->v2, v2->v3, ...) this will
cost you lots of
extra cpu. (see sample below)
>
>
Regards
> Kim
>
> /**
> * Version
1:
> */
> class A {
> private static
final int version = 1;
> private ArrayList data = "new"
ArrayList();
>
> private void
writeObject(ObjectOutputStream ous) throws IOException
{
>
out.writeObject(version);
>
out.writeObject(data);
>
}
>
> private void
readObject(ObjectInputStream ois) throws IOException,
>
ClassNotFoundException {
>
version =
out.readObject();
> if ( 1
== version )
{
> data =
"out.readObject();
>
}
> }
> }
>
>
/**
> * Version 2:
> */
> class A
{
> private static final int version =
2;
> private ArrayList data = "new"
ArrayList();
> private String name =
"name";
>
> private void
writeObject(ObjectOutputStream ous) throws IOException
{
>
out.writeObject(version);
>
out.writeObject(data);
>
out.writeObject(name);
>
}
>
> private void
readObject(ObjectInputStream ois) throws IOException,
>
ClassNotFoundException {
>
version =
out.readObject();
> data =
"out.readObject();
> if
(version > 1)
{
> name =
out.readObject();
>
}
> else
{
> /*
convert version 1 data to meaningful version 2 or throw
exception
*/
>
name = "none";
>
}
> }
> }
>
>
/**
> * Version 3:
> */
> class A
{
> private static final int version =
3;
> private ArrayList data = "new"
ArrayList();
> private String name =
"name";
> private int age =
0;
>
> private void
writeObject(ObjectOutputStream ous) throws IOException
{
>
out.writeObject(version);
>
out.writeObject(data);
>
out.writeObject(name);
>
out.writeObject(age);
>
}
>
> private void
readObject(ObjectInputStream ois) throws IOException,
>
ClassNotFoundException {
>
version =
out.readObject();
>
data = "out.readObject();
>
if (version > 1)
{
> name =
out.readObject();
>
}
> else
{
> /*
convert version 1 data to meaningful version 2 or throw
exception
*/
>
name = "name";
>
}
> if (version > 2)
{
> age =
out.readObject();
>
}
> else
{
> /*
convert version 2 data to meaningful version 3 or throw
exception
*/
> age
= 0;
>
}
> }
> }
>
>
>
-----Ursprungliche Nachricht-----
> Von: Zlatko Kostadinov [mailto:[EMAIL PROTECTED]]
>
Gesendet: Montag, 26. August 2002 13:14
> An: JDJList
> Betreff:
[jdjlist] problem with serizlization
>
>
> Hi
guys
>
> I had serizlized objects in this way:
>
> class
A {
> private ArrayList data = "new"
ArrayList();
>
> private void
writeObject(ObjectOutputStream ous) throws IOException
{
>
out.writeObject(data);
>
}
>
> private void
readObject(ObjectInputStream ois) throws IOException,
>
ClassNotFoundException {
>
data = "out.readObject();
> }
>
}
>
> And my program now works with objects of this type. I want to
add new
field
> in the class so the class will be
>
> class
A {
> private ArrayList data = "new"
ArrayList();
> private name =
"name";
>
> private void
writeObject(ObjectOutputStream ous) throws IOException
{
>
out.writeObject(data);
>
out.writeObject(name);
>
}
>
> private void
readObject(ObjectInputStream ois) throws IOException,
>
ClassNotFoundException {
>
data = "out.readObject();
>
// here is the problem - how to determine is this an instance of
the
>
new version or no.
> //
must I read the name or not.
> }
>
}
>
> Any ideas are wellcome
> Regards
>
Zlatko
>
>
> To change your JDJList options, please
visit:
http://www.sys-con.com/java/list.cfm
>
>
To change your JDJList options, please visit:
http://www.sys-con.com/java/list.cfm
>
To
change your JDJList options, please visit: http://www.sys-con.com/java/list.cfm
THIS TRANSMISSION, INCLUDING ANY ATTACHMENTS OR FILES,
CONTAINS AIRNET COMMUNICATIONS CORPORATION CONFIDENTIAL
AND PROPRIETARY INFORMATION WHICH MAY BE OTHERWISE EXEMPT
FROM DISCLOSURE.
The information is intended to be for the exclusive use of the individual
or entity named above. If you are not the intended recipient,
be advised that any disclosure, copying, distribution or other use
of this information is strictly prohibited. If you have received this
transmission in error, please notify us by telephone at 1-321-984-1990 or
by email to [EMAIL PROTECTED] immediately and do not read, print
or save this information in any manner.
