magro / kryo-serializers

More kryo serializers
Apache License 2.0
381 stars 120 forks source link

UnmodifiableCollectionsSerializer fails to copy values of unmodifiable map #81

Open johnou opened 6 years ago

johnou commented 6 years ago

I recently found that UnmodifiableCollectionsSerializer fails to copy values of unmodifiable map, as a workaround I am taking a copy of the values before, well, cloning.. :scream:

    public static void main(String[] args) {
        Map<Integer, Integer> map = Collections.unmodifiableMap(new HashMap<Integer, Integer>() {{
            put(1, 1);
        }});
        KryoPool kryoPool = new KryoPool.Builder(() -> {
            Kryo kryo = new Kryo();
            kryo.setInstantiatorStrategy(new Kryo.DefaultInstantiatorStrategy(new StdInstantiatorStrategy()));
            UnmodifiableCollectionsSerializer.registerSerializers(kryo);
            return kryo;
        }).softReferences().build();
        kryoPool.run(kryo -> kryo.copy(map.values()));
    }

Fails with..

Exception in thread "main" java.lang.UnsupportedOperationException
    at java.util.AbstractCollection.add(AbstractCollection.java:262)
    at com.esotericsoftware.kryo.serializers.CollectionSerializer.copy(CollectionSerializer.java:149)
    at com.esotericsoftware.kryo.serializers.CollectionSerializer.copy(CollectionSerializer.java:40)
    at com.esotericsoftware.kryo.Kryo.copy(Kryo.java:914)
    at de.javakaffee.kryoserializers.UnmodifiableCollectionsSerializer.copy(UnmodifiableCollectionsSerializer.java:95)
    at com.esotericsoftware.kryo.Kryo.copy(Kryo.java:914)
magro commented 6 years ago

Thanks for reporting, do you want to submit a pull request?