JDK-6380094 : LTP: Could not encode java.sql.Date
  • Type: Bug
  • Component: client-libs
  • Sub-Component: java.beans
  • Affected Version: 7
  • Priority: P4
  • Status: Closed
  • Resolution: Duplicate
  • OS: windows_xp
  • CPU: x86
  • Submitted: 2006-02-02
  • Updated: 2011-03-14
  • Resolved: 2006-04-19
Related Reports
Duplicate :  
Description
1. Without any persistence delegate

When I simply call:

[CODE]
Date date = new Date( System.currentTimeMillis() );
XMLEncoder encoder = new XMLEncoder( new FileOutputStream( "TEST" ) );
encoder.writeObject( date );
encoder.close();
[/CODE]

I get the following error messages:

[CODE]
java.lang.InstantiationException: java.sql.Date
Continuing ...
java.lang.Exception: XMLEncoder: discarding statement XMLEncoder.writeObject(Date);
Continuing ...
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
	at com.sun.beans.ObjectHandler.dequeueResult(ObjectHandler.java:137)
	at java.beans.XMLDecoder.readObject(XMLDecoder.java:218)
	at Main.main(Main.java:63)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:585)
	at com.intellij.rt.execution.application.AppMain.main(AppMain.java:86)
[/CODE]


2. With default persistance delegate

When I simply call:

[CODE]
Date date = new Date( System.currentTimeMillis() );
PersistenceDelegate delegate = new DefaultPersistenceDelegate( new String[]{"time"} );
XMLEncoder encoder = new XMLEncoder( new FileOutputStream( "TEST" ) );
encoder.setPersistenceDelegate( Date.class, delegate );
encoder.writeObject( date );
encoder.close();
[/CODE]

I get the following error messages:

[CODE]
java.lang.IllegalArgumentException
Continuing ...
java.lang.IllegalArgumentException
Continuing ...
java.lang.IllegalArgumentException
Continuing ...
[/CODE]


3. With custom persistance delegate

The following code works fine:

[CODE]
Date date = new Date( System.currentTimeMillis() );
PersistenceDelegate delegate = new PersistenceDelegate()
{
    protected Expression instantiate( Object oldInstance, Encoder out )
    {
        Date date = ( Date )oldInstance;
        Long time = Long.valueOf( date.getTime() );
        return new Expression( date, date.getClass(), "new", new Object[]{time} );
    }
};
XMLEncoder encoder = new XMLEncoder( new FileOutputStream( "TEST" ) );
encoder.setPersistenceDelegate( Date.class, delegate );
encoder.writeObject( date );
encoder.close();
[/CODE]

Comments
EVALUATION We should provide custom persistence delegate for java.sql.Date
02-02-2006