Skip to content

Commit

Permalink
Merge pull request #78 from robreeves/joda-localtime
Browse files Browse the repository at this point in the history
Added support for joda LocalTime serialization
  • Loading branch information
magro committed Jan 27, 2018
2 parents d8f455b + 4d92839 commit bbdc0b3
Show file tree
Hide file tree
Showing 3 changed files with 103 additions and 1 deletion.
4 changes: 3 additions & 1 deletion README.markdown
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ A project that provides [kryo](https://github.com/EsotericSoftware/kryo) (v2, v3
* jodatime/JodaIntervalSerializer - serializer for joda's Interval
* jodatime/JodaLocalDateSerializer - serializer for joda's LocalDate
* jodatime/JodaLocalDateTimeSerializer - serializer for joda's LocalDateTime
* jodatime/JodaLocalTimeSerializer - serializer for joda's LocalTime
* protobuf/ProtobufSerializer - serializer for protobuf GeneratedMessages
* wicket/MiniMapSerializer - serializer for wicket's MiniMap

Expand Down Expand Up @@ -91,10 +92,11 @@ kryo.register( CGLibProxySerializer.CGLibProxyMarker.class, new CGLibProxySerial
ListSerializer.registerSerializers( kryo );
MapSerializer.registerSerializers( kryo );
SetSerializer.registerSerializers( kryo );
// joda DateTime, LocalDate and LocalDateTime
// joda DateTime, LocalDate, LocalDateTime and LocalTime
kryo.register( DateTime.class, new JodaDateTimeSerializer() );
kryo.register( LocalDate.class, new JodaLocalDateSerializer() );
kryo.register( LocalDateTime.class, new JodaLocalDateTimeSerializer() );
kryo.register( LocalDateTime.class, new JodaLocalTimeSerializer() );
// protobuf
kryo.register( SampleProtoA.class, new ProtobufSerializer() ); // or override Kryo.getDefaultSerializer as shown below
// wicket
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package de.javakaffee.kryoserializers.jodatime;

import com.esotericsoftware.kryo.Kryo;
import com.esotericsoftware.kryo.Serializer;
import com.esotericsoftware.kryo.io.Input;
import com.esotericsoftware.kryo.io.Output;
import org.joda.time.Chronology;
import org.joda.time.DateTimeZone;
import org.joda.time.LocalTime;
import org.joda.time.chrono.*;

/**
* A format for Joda {@link LocalTime}, that stores the milliseconds of the day and chronology
* as separate attributes.
* <p>
* The following chronologies are supported:
* <ul>
* <li>{@link ISOChronology}</li>
* <li>{@link CopticChronology}</li>
* <li>{@link EthiopicChronology}</li>
* <li>{@link GregorianChronology}</li>
* <li>{@link JulianChronology}</li>
* <li>{@link IslamicChronology}</li>
* <li>{@link BuddhistChronology}</li>
* <li>{@link GJChronology}</li>
* </ul>
* </p>
*
* @author <a href="mailto:robertpreeves@gmail.com">Rob Reeves</a>
*/
public class JodaLocalTimeSerializer extends Serializer<LocalTime> {
@Override
public void write(Kryo kryo, Output output, LocalTime object) {
final int time = object.getMillisOfDay();
output.writeInt(time, true);

//LocalTime always converts the internal DateTimeZone to UTC so there is no need to serialize it.
final String chronologyId = IdentifiableChronology.getChronologyId(object.getChronology());
output.writeString(chronologyId);
}

@Override
public LocalTime read(Kryo kryo, Input input, Class<LocalTime> type) {
final int time = input.readInt(true);
final Chronology chronology = IdentifiableChronology.readChronology(input);

//LocalTime always converts the internal DateTimeZone to UTC.
return new LocalTime(time, chronology.withZone(DateTimeZone.UTC));
}

@Override
public LocalTime copy(Kryo kryo, LocalTime original) {
return new LocalTime(original);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package de.javakaffee.kryoserializers.jodatime;

import com.esotericsoftware.kryo.Kryo;
import org.joda.time.*;
import org.joda.time.chrono.GregorianChronology;
import org.testng.Assert;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;

import static de.javakaffee.kryoserializers.KryoTest.deserialize;
import static de.javakaffee.kryoserializers.KryoTest.serialize;

/**
* Tests for {@link JodaLocalTimeSerializer}.
*
* @author <a href="mailto:robertpreeves@gmail.com">Rob Reeves</a>
*/
public class JodaLocalTimeSerializerTest {
private Kryo _kryo;

@BeforeTest
protected void beforeTest() {
_kryo = new Kryo();
_kryo.register(LocalTime.class, new JodaLocalTimeSerializer());
}

@Test(enabled = true)
public void testJodaLocalTime() {
final DateTimeZone tz = DateTimeZone.forID("America/Los_Angeles");
final Chronology chronology = GregorianChronology.getInstance(tz);
final LocalTime obj = new LocalTime(null, chronology);
final byte[] serialized = serialize(_kryo, obj);
final LocalTime deserialized = deserialize(_kryo, serialized, LocalTime.class);
Assert.assertEquals(deserialized, obj);
}

@Test(enabled = true)
public void testCopyJodaLocalTime() {
final DateTimeZone tz = DateTimeZone.forID("America/Los_Angeles");
final Chronology chronology = GregorianChronology.getInstance(tz);
final LocalTime obj = new LocalTime(52341234, chronology);
final LocalTime copy = _kryo.copy(obj);
Assert.assertEquals(copy, obj);
}
}

0 comments on commit bbdc0b3

Please sign in to comment.