This kind of serialization compatibility issue may be found again later,
if only RI use some non-API class as default implementation of
serializable abstract class. So I think we need some discussion on this
issue for a principle.
I propose two choice:
1. just let it be
2. mimic a class as RI, in this TimeZone case, create a
sun.util.calendar.ZoneInfo by wrapping java.util.SimpleTimeZone, it
works but risky and ugly, it is risky because RI may change the
implementation class later(which will also break RI's serialization
compatibility of course)
comments?
Paulex Yang (JIRA) wrote:
java.util.TimeZone's default implementation may cause many classes'
serialization non-compatible with RI
--------------------------------------------------------------------------------------------------------
Key: HARMONY-184
URL: http://issues.apache.org/jira/browse/HARMONY-184
Project: Harmony
Type: Bug
Components: Classlib
Reporter: Paulex Yang
Priority: Critical
Static factory methods, java.util.TimeZone.getInstance(String) and
getDefault(), are only ways to get a TimeZone instance, but Harmony and RI uses
different classes as default implementation, which cause serialization
non-compatible. Further, all classes whose serialization form includes TimeZone
won't compatible with RI, too, for example, java.util.Calendar(with subclass),
java.text.DateFormat(with subclass), etc.
But the incompatiblity is hard to be imputed to Harmony, because Harmony use
API class SimpleTimeZone as default implementation, but RI use a non-API class,
whose full name is sun.util.calendar.ZoneInfo.
The reproduce procedure:
1. To serialize TimeZone object to a file in RI, run codes below in RI
public void writeObject(){
TimeZone zone = TimeZone.getTimeZone("GMT");
ObjectOutputStream ooutput = null;
try {
ooutput = new ObjectOutputStream(new
FileOutputStream("TimeZone.ser"));
ooutput.writeObject(zone);
} finally {
try {
if (null != ooutput) {
ooutput.close();
}
} catch (Exception e) {
}
}
}
2. Trying to deserialize this object from file, run codes below
public void readObject(){
ObjectInputStream oinput = null;
try {
oinput = new ObjectInputStream(new
FileInputStream("TimeZone.ser"));
TimeZone newObj = (TimeZone)oinput.readObject();
} finally {
try {
if (null != oinput) {
oinput.close();
}
} catch (Exception e) {
}
}
}
Run in RI, passes without any failure
Run in Harmony, exception throwed as below:
java.lang.ClassNotFoundException: sun.util.calendar.ZoneInfo
at java.lang.Class.forName(Class.java:154)
at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:2226)
... ...
--
Paulex Yang
China Software Development Lab
IBM