odnoklassniki/one-nio

Exception in serialize java.sql.Time and java.util.Date

QIvan opened this issue · 3 comments

QIvan commented

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.

QIvan commented

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. можно, хотя английский предпочтительней.

QIvan commented

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 ???