diff --git a/src/com/esotericsoftware/kryo/Kryo.java b/src/com/esotericsoftware/kryo/Kryo.java index fb5f6d76d..2b26efe61 100644 --- a/src/com/esotericsoftware/kryo/Kryo.java +++ b/src/com/esotericsoftware/kryo/Kryo.java @@ -28,6 +28,7 @@ import java.lang.reflect.Proxy; import java.math.BigDecimal; import java.math.BigInteger; +import java.net.URL; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.Calendar; @@ -43,6 +44,7 @@ import java.util.TreeMap; import java.util.TreeSet; +import com.esotericsoftware.kryo.serializers.DefaultSerializers.URLSerializer; import com.esotericsoftware.kryo.serializers.OptionalSerializers; import com.esotericsoftware.kryo.serializers.GenericsResolver; import com.esotericsoftware.kryo.serializers.TimeSerializers; @@ -216,6 +218,7 @@ public Kryo (ClassResolver classResolver, ReferenceResolver referenceResolver, S addDefaultSerializer(Calendar.class, CalendarSerializer.class); addDefaultSerializer(Locale.class, LocaleSerializer.class); addDefaultSerializer(Charset.class, CharsetSerializer.class); + addDefaultSerializer(URL.class, URLSerializer.class); OptionalSerializers.addDefaultSerializers(this); TimeSerializers.addDefaultSerializers(this); lowPriorityDefaultSerializerCount = defaultSerializers.size(); diff --git a/src/com/esotericsoftware/kryo/serializers/DefaultSerializers.java b/src/com/esotericsoftware/kryo/serializers/DefaultSerializers.java index 53a31f543..3fab0cd1a 100644 --- a/src/com/esotericsoftware/kryo/serializers/DefaultSerializers.java +++ b/src/com/esotericsoftware/kryo/serializers/DefaultSerializers.java @@ -21,6 +21,8 @@ import java.math.BigDecimal; import java.math.BigInteger; +import java.net.MalformedURLException; +import java.net.URL; import java.nio.charset.Charset; import java.util.Calendar; import java.util.Collection; @@ -838,7 +840,7 @@ protected static boolean isSameLocale(Locale locale, String language, String cou } } - /** Serializer for {@link Charset}. Added as default serializer for java >= 7. */ + /** Serializer for {@link Charset}. */ public static class CharsetSerializer extends Serializer { { setImmutable(true); } @@ -853,4 +855,23 @@ public Charset read(Kryo kryo, Input input, Class type) { } + /** Serializer for {@link URL}. */ + public static class URLSerializer extends Serializer { + + { setImmutable(true); } + + public void write(Kryo kryo, Output output, URL object) { + output.writeString(object.toExternalForm()); + } + + public URL read(Kryo kryo, Input input, Class type) { + try { + return new java.net.URL(input.readString()); + } catch (MalformedURLException e) { + throw new KryoException(e); + } + } + + } + } diff --git a/test/com/esotericsoftware/kryo/DefaultSerializersTest.java b/test/com/esotericsoftware/kryo/DefaultSerializersTest.java index df02db068..01589a02d 100644 --- a/test/com/esotericsoftware/kryo/DefaultSerializersTest.java +++ b/test/com/esotericsoftware/kryo/DefaultSerializersTest.java @@ -21,6 +21,7 @@ import java.math.BigDecimal; import java.math.BigInteger; +import java.net.URL; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.Arrays; @@ -34,6 +35,7 @@ import com.esotericsoftware.kryo.io.Input; import com.esotericsoftware.kryo.io.Output; +import org.objenesis.strategy.StdInstantiatorStrategy; /** @author Nathan Sweet */ public class DefaultSerializersTest extends KryoTestCase { @@ -365,6 +367,15 @@ public void testCharset() { } } + public void testURLSerializer () throws Exception { + kryo.setInstantiatorStrategy(new Kryo.DefaultInstantiatorStrategy(new StdInstantiatorStrategy())); + kryo.setRegistrationRequired(true); + kryo.register(URL.class); + + roundTrip(41, 41, new URL("https://github.com/EsotericSoftware/kryo")); + roundTrip(78, 78, new URL("https://github.com:443/EsotericSoftware/kryo/pulls?utf8=%E2%9C%93&q=is%3Apr")); + } + public enum TestEnum { a, b, c } diff --git a/test/com/esotericsoftware/kryo/SerializationCompatTest.java b/test/com/esotericsoftware/kryo/SerializationCompatTest.java index a226eea18..3bbf13d92 100644 --- a/test/com/esotericsoftware/kryo/SerializationCompatTest.java +++ b/test/com/esotericsoftware/kryo/SerializationCompatTest.java @@ -74,12 +74,12 @@ public class SerializationCompatTest extends KryoTestCase { private static final String ENDIANNESS = ByteOrder.nativeOrder() == ByteOrder.LITTLE_ENDIAN ? "le" : "be"; private static final int JAVA_VERSION = Integer.parseInt(System.getProperty("java.version").split("\\.")[1]); - private static final int EXPECTED_DEFAULT_SERIALIZER_COUNT = JAVA_VERSION < 8 ? 34 : 52; + private static final int EXPECTED_DEFAULT_SERIALIZER_COUNT = JAVA_VERSION < 8 ? 35 : 53; private static final List> TEST_DATAS = new ArrayList>(); static { - TEST_DATAS.add(new TestDataDescription("3.0.0", new TestData(), 1824, 1932)); - if(JAVA_VERSION >= 8) TEST_DATAS.add(new TestDataDescription("3.1.0", new TestDataJava8(), 1984, 2136)); + TEST_DATAS.add(new TestDataDescription("3.0.0", new TestData(), 1865, 1973)); + if(JAVA_VERSION >= 8) TEST_DATAS.add(new TestDataDescription("3.1.0", new TestDataJava8(), 2025, 2177)); }; @Override diff --git a/test/com/esotericsoftware/kryo/SerializationCompatTestData.java b/test/com/esotericsoftware/kryo/SerializationCompatTestData.java index cd784edcf..2ba32e936 100644 --- a/test/com/esotericsoftware/kryo/SerializationCompatTestData.java +++ b/test/com/esotericsoftware/kryo/SerializationCompatTestData.java @@ -26,6 +26,8 @@ import java.io.Serializable; import java.math.BigDecimal; import java.math.BigInteger; +import java.net.MalformedURLException; +import java.net.URL; import java.nio.charset.Charset; import java.time.*; import java.util.*; @@ -114,6 +116,7 @@ public static class TestData implements Serializable { private Calendar _calendar; private Locale _locale; List _charsets; + private URL _url; private Gender _enum; private EnumSet _enumSet; @@ -188,6 +191,11 @@ public TestData () { _locale = Locale.ENGLISH; _charsets = new ArrayList(Arrays.asList(Charset.forName("ISO-8859-1"), Charset.forName("US-ASCII"), Charset.forName("UTF-8"), Charset.forName("UTF-16"), Charset.forName("UTF-16BE"), Charset.forName("UTF-16LE"))); + try { + _url = new java.net.URL("https://github.com/EsotericSoftware/kryo"); + } catch (MalformedURLException e) { + throw new RuntimeException(e); + } _enum = Gender.FEMALE; _enumSet = EnumSet.allOf(Gender.class); diff --git a/test/resources/TestData-bytebuffer.ser b/test/resources/TestData-bytebuffer.ser index 45f843a47..c3711fee1 100644 Binary files a/test/resources/TestData-bytebuffer.ser and b/test/resources/TestData-bytebuffer.ser differ diff --git a/test/resources/TestData-fast.ser b/test/resources/TestData-fast.ser index 71289a5aa..0185c4185 100644 Binary files a/test/resources/TestData-fast.ser and b/test/resources/TestData-fast.ser differ diff --git a/test/resources/TestData-standard.ser b/test/resources/TestData-standard.ser index 45f843a47..c3711fee1 100644 Binary files a/test/resources/TestData-standard.ser and b/test/resources/TestData-standard.ser differ diff --git a/test/resources/TestData-unsafe-le.ser b/test/resources/TestData-unsafe-le.ser index 459f9f62f..396610c5b 100644 Binary files a/test/resources/TestData-unsafe-le.ser and b/test/resources/TestData-unsafe-le.ser differ diff --git a/test/resources/TestData-unsafeMemory-le.ser b/test/resources/TestData-unsafeMemory-le.ser index 459f9f62f..396610c5b 100644 Binary files a/test/resources/TestData-unsafeMemory-le.ser and b/test/resources/TestData-unsafeMemory-le.ser differ diff --git a/test/resources/TestDataJava8-bytebuffer.ser b/test/resources/TestDataJava8-bytebuffer.ser index c20760de9..7f0a5d437 100644 Binary files a/test/resources/TestDataJava8-bytebuffer.ser and b/test/resources/TestDataJava8-bytebuffer.ser differ diff --git a/test/resources/TestDataJava8-fast.ser b/test/resources/TestDataJava8-fast.ser index 3abe7dd80..e8ec339c3 100644 Binary files a/test/resources/TestDataJava8-fast.ser and b/test/resources/TestDataJava8-fast.ser differ diff --git a/test/resources/TestDataJava8-standard.ser b/test/resources/TestDataJava8-standard.ser index c20760de9..7f0a5d437 100644 Binary files a/test/resources/TestDataJava8-standard.ser and b/test/resources/TestDataJava8-standard.ser differ diff --git a/test/resources/TestDataJava8-unsafe-le.ser b/test/resources/TestDataJava8-unsafe-le.ser index 31c4c8556..342165f03 100644 Binary files a/test/resources/TestDataJava8-unsafe-le.ser and b/test/resources/TestDataJava8-unsafe-le.ser differ diff --git a/test/resources/TestDataJava8-unsafeMemory-le.ser b/test/resources/TestDataJava8-unsafeMemory-le.ser index 31c4c8556..342165f03 100644 Binary files a/test/resources/TestDataJava8-unsafeMemory-le.ser and b/test/resources/TestDataJava8-unsafeMemory-le.ser differ