Exception in serialize java.sql.Time and java.util.Date
QIvan opened this issue · 3 comments
This test is failed:
package one.nio.serial;
/*imports {...} */
public class SerializationTest extends TestCase {
/* others test-cases {...} */
static class SqlDatetime implements Serializable {
private final java.sql.Date date;
private final java.sql.Time time;
SqlDatetime(java.sql.Date date, java.sql.Time time) {
this.date = date;
this.time = time;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
SqlDatetime sqlDatetime = (SqlDatetime) o;
return Objects.equals(date, sqlDatetime.date) &&
Objects.equals(time, sqlDatetime.time);
}
}
public void testSqlDatetime() throws IOException, ClassNotFoundException {
checkSerialize(new SqlDatetime(new java.sql.Date(System.currentTimeMillis()),
new java.sql.Time(System.currentTimeMillis())));
}
}
with an exception:
java.io.IOException: writeObject() is not fully supported. See implementation notes.
at one.nio.serial.gen.NullObjectOutputStream.unsupported(NullObjectOutputStream.java:159)
at one.nio.serial.gen.NullObjectOutputStream.writeLong(NullObjectOutputStream.java:130)
at java.util.Date.writeObject(Date.java:1323)
at sun.reflect.Delegate1_Date.calcSize(Unknown Source)
at one.nio.serial.GeneratedSerializer.calcSize(GeneratedSerializer.java:115)
at one.nio.serial.CalcSizeStream.writeObject(CalcSizeStream.java:122)
at sun.reflect.Delegate0_SqlDatetime.calcSize(Unknown Source)
at one.nio.serial.GeneratedSerializer.calcSize(GeneratedSerializer.java:115)
at one.nio.serial.CalcSizeStream.writeObject(CalcSizeStream.java:122)
at one.nio.serial.SerializationTest.clone(SerializationTest.java:38)
at one.nio.serial.SerializationTest.checkSerialize(SerializationTest.java:84)
at one.nio.serial.SerializationTest.testSqlDatetime(SerializationTest.java:391)
That's because one-nio generates Serializer like this (decompile to source):
public final class Delegate6_Date extends MagicAccessorImpl implements Delegate {
public Delegate6_Date() {
}
public final void calcSize(Object var1, CalcSizeStream var2) throws IOException {
((Date)var1).writeObject(NullObjectOutputStream.INSTANCE);
}
public final void write(Object var1, DataStream var2) throws IOException {
((Date)var1).writeObject(NullObjectOutputStream.INSTANCE);
}
public final Object read(DataStream var1) throws IOException, ClassNotFoundException {
java.sql.Date var2;
var1.register(var2 = new java.sql.Date);
var2.readObject(NullObjectInputStream.INSTANCE);
return var2;
}
}
and NullObjectOutputStream throws this exception.
I know that I can do something like:
Repository.provideSerializer(new SqlDateSerializer());
Repository.provideSerializer(new SqlTimeSerializer());
but you have TimestampSerializer for java.util.Timestamp and generated SqlDateSerializer seems like a bug. Isn't?
P.S. а тут можно писать на русском?
This problem is covered in FAQ.
Of course, it is possible to make custom serializers for classes not supported by generic serialization, however, I tried to keep balance between amount of custom stuff vs. functionality for typical use cases. java.sql.[Date|Time]
seem to be less popular than java.util.Date
and java.sql.Timestamp
. E.g. java.sql.[Date|Time]
are never used in serializable beans in the whole codebase of ok.ru.
P.S. можно, хотя английский предпочтительней.
aahhh.... sorry... I found in the wiki this issue...
But what the problem with those classes? There is no fields in java.sql.Date and java.sql.Time ?
Why can't you just add
Repository.addBootstrap(new SqlDateSerializer());
Repository.addBootstrap(new SqlTimeSerializer());
in one.nio.serial.Repository
???