[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Please help: InvalidClassException
- To: ozone-users@ozone-db.org
- Subject: Please help: InvalidClassException
- From: Jörg Prante <joerg@7val.com>
- Date: Mon, 21 May 2001 15:14:41 +0200
- Delivered-To: softw7-ozone-db:org-ozone-users@ozone-db.org
- Organization: Sevenval AG e-commerce base technologies
- Reply-To: joerg@7val.com
Hi!
While using Ozone DB in a client-server environment powering a Tomcat servlet
engine, I often stop and start the servlet engine together with the Ozone DB
server. A SiteManagerImpl class accesses some Ozone objects when starting up
the system. This works fine for the first time, when the database is empty.
After the first run, the database is filled with objects. These objects
should be available for reading at the next time. When I subsequently
shutdown the system, compile, and start again, the Ozone server sometimes
denies reading the objects from the database - and sometimes not.
In WizardObjectContainer, the following method sometimes throws an
InvalidClassException while the system is restarting:
-------- code snippet from WizardObjectContainer.java ---------
public final void readExternal( ObjectInput in ) throws IOException,
ClassNotFoundException {
// System.out.println ("container.readExternal()...");
byte streamVersion = in.readByte();
target = (OzoneCompatible)in.readObject();
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>>>>>this line throws the exception<<<<<<
if (target != null) {
target.setContainer( this );
}
// objID = (ObjectID)in.readObject();
objID = new ObjectID( in.readLong() );
name = null;
if (in.readByte() != 0) {
name = in.readUTF();
}
state = (int)in.readByte();
}
---------------- end of code snippet -------------
Here is the stack trace of the exception:
-------- snip ---------
[warn] (903) Transaction: objectForName()
java.io.InvalidClassException: com.sevenval.fit.contract.ozone.OzoneSi
teManagerImpl; Local class not compatible: stream classdesc
serialVers
ionUID=-4269804347343892228 local class
serialVersionUID=-730019390930
258627
at java.io.ObjectStreamClass.validateLocalClass(ObjectStreamClass.jav
a:523)
at java.io.ObjectStreamClass.setClass(ObjectStreamClass.java:567)
at java.io.ObjectInputStream.inputClassDescriptor(ObjectInputStream.j
ava:936)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:366)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:236)
at java.io.ObjectInputStream.inputObject(ObjectInputStream.java:1186)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:386)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:236)
at org.ozoneDB.core.wizardStore.WizardObjectContainer.readExternal(Wi
zardObjectContainer.java:216)
at org.ozoneDB.core.wizardStore.Cluster.readExternal(Cluster.java:340
)
at java.io.ObjectInputStream.inputObject(ObjectInputStream.java:1212)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:386)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:236)
at org.ozoneDB.core.wizardStore.ClusterStore.loadData(ClusterStore.ja
va:682)
at org.ozoneDB.core.wizardStore.ClusterStore.loadCluster(ClusterStore
.java:328)
at org.ozoneDB.core.wizardStore.WizardStore.containerForID(WizardStor
e.java:362)
at org.ozoneDB.core.wizardStore.WizardStore.containerForName(WizardSt
ore.java:386)
at org.ozoneDB.core.Transaction.objectForName(Transaction.java:575)
at org.ozoneDB.core.DbRemote.DbObjForName.perform(DbObjForName.java:3
6)
at org.ozoneDB.core.Transaction.performCommand(Transaction.java:273)
at org.ozoneDB.core.TransactionManager.performCommand(TransactionMana
ger.java:366)
at org.ozoneDB.core.TransactionManager.completeTransaction(Transactio
nManager.java:334)
at org.ozoneDB.core.TransactionManager.handleCommand(TransactionManag
er.java:249)
at org.ozoneDB.core.InvokeServer.handleClientEvent(InvokeServer.java:
76)
at org.ozoneDB.DxLib.net.DxMultiServerClient.run(DxMultiServerClient.
java:43)
at java.lang.Thread.run(Thread.java:484)
------- snip ----------
The only workaround I know is to re-initialize the whole database, deleting
all data. This is surely not desirable at all.
Please explain to me how I can get out of this situation, or how I can fix
this. Maybe it's an Ozone bug, or an odd Java feature of de-serializing
classes. I suppose the serialization class ID mismatch comes from proxy
communication with the Ozone server, which might expect identical objects,
but this identity is destroyed between compile/build cycles. I don't
understand the Ozone implementation completely, so I'm not able to improve
the readExternal() method in WizardObjectContainer. However, the class ID
mismatch between different Ozone runs is strange and should not happen.
The software I'm using:
- Linux 2.2.16
- Sun Java JDK 1.3.0
- OzoneDB 0.6 (same WizardObjectContainer code also present in 1.0.1)
The Ozone 0.6 source code is included into the build system, and Ozone proxy
code for SiteManagerImpl is auto-generated by Ant each turn-around
(SiteManagerImpl_Proxy.java).
Jörg
--
Jörg Prante
Sevenval AG (HRB 32757) e-business marketing technologies
D-50667 Köln . Alter Markt 36-42
Fon +49 221 65 00 70 . Fax +49 221 42 49 891 . Mobile +49 175 466 19 18
http://www.sevenval.de . joerg@7val.com