Skip to content

Commit f5ad6e8

Browse files
Add TreeSetSerializer, closes #139 (Kryo gets ClassCastException when deserializing TreeSet with Comparator)
git-svn-id: http://kryo.googlecode.com/svn/trunk@416 a9660ef0-a895-11de-8ba5-91705c1537ed
1 parent 2f95828 commit f5ad6e8

File tree

4 files changed

+44
-0
lines changed

4 files changed

+44
-0
lines changed

src/com/esotericsoftware/kryo/Kryo.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import java.util.Map;
1919
import java.util.TimeZone;
2020
import java.util.TreeMap;
21+
import java.util.TreeSet;
2122

2223
import org.objenesis.instantiator.ObjectInstantiator;
2324
import org.objenesis.strategy.InstantiatorStrategy;
@@ -68,6 +69,7 @@
6869
import com.esotericsoftware.kryo.serializers.DefaultSerializers.StringSerializer;
6970
import com.esotericsoftware.kryo.serializers.DefaultSerializers.TimeZoneSerializer;
7071
import com.esotericsoftware.kryo.serializers.DefaultSerializers.TreeMapSerializer;
72+
import com.esotericsoftware.kryo.serializers.DefaultSerializers.TreeSetSerializer;
7173
import com.esotericsoftware.kryo.serializers.DefaultSerializers.VoidSerializer;
7274
import com.esotericsoftware.kryo.serializers.FieldSerializer;
7375
import com.esotericsoftware.kryo.serializers.MapSerializer;
@@ -180,6 +182,7 @@ public Kryo (ClassResolver classResolver, ReferenceResolver referenceResolver, S
180182
addDefaultSerializer(Collections.singletonList(null).getClass(), CollectionsSingletonListSerializer.class);
181183
addDefaultSerializer(Collections.singletonMap(null, null).getClass(), CollectionsSingletonMapSerializer.class);
182184
addDefaultSerializer(Collections.singleton(null).getClass(), CollectionsSingletonSetSerializer.class);
185+
addDefaultSerializer(TreeSet.class, TreeSetSerializer.class);
183186
addDefaultSerializer(Collection.class, CollectionSerializer.class);
184187
addDefaultSerializer(TreeMap.class, TreeMapSerializer.class);
185188
addDefaultSerializer(Map.class, MapSerializer.class);

src/com/esotericsoftware/kryo/serializers/DefaultSerializers.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import java.math.BigDecimal;
55
import java.math.BigInteger;
66
import java.util.Calendar;
7+
import java.util.Collection;
78
import java.util.Collections;
89
import java.util.Comparator;
910
import java.util.Currency;
@@ -16,6 +17,7 @@
1617
import java.util.Set;
1718
import java.util.TimeZone;
1819
import java.util.TreeMap;
20+
import java.util.TreeSet;
1921

2022
import com.esotericsoftware.kryo.Kryo;
2123
import com.esotericsoftware.kryo.KryoException;
@@ -556,4 +558,20 @@ protected Map createCopy (Kryo kryo, Map original) {
556558
return new TreeMap(((TreeMap)original).comparator());
557559
}
558560
}
561+
562+
static public class TreeSetSerializer extends CollectionSerializer {
563+
public void write (Kryo kryo, Output output, Collection collection) {
564+
TreeSet treeSet = (TreeSet)collection;
565+
kryo.writeClassAndObject(output, treeSet.comparator());
566+
super.write(kryo, output, collection);
567+
}
568+
569+
protected TreeSet create (Kryo kryo, Input input, Class<Collection> type) {
570+
return new TreeSet((Comparator)kryo.readClassAndObject(input));
571+
}
572+
573+
protected TreeSet createCopy (Kryo kryo, Collection original) {
574+
return new TreeSet(((TreeSet)original).comparator());
575+
}
576+
}
559577
}

test/com/esotericsoftware/kryo/CollectionSerializerTest.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,12 @@
33

44
import java.util.ArrayList;
55
import java.util.LinkedList;
6+
import java.util.TreeMap;
7+
import java.util.TreeSet;
68
import java.util.concurrent.CopyOnWriteArrayList;
79

10+
import com.esotericsoftware.kryo.MapSerializerTest.KeyComparator;
11+
import com.esotericsoftware.kryo.MapSerializerTest.KeyThatIsntComparable;
812
import com.esotericsoftware.kryo.serializers.CollectionSerializer;
913
import com.esotericsoftware.kryo.serializers.DefaultSerializers.StringSerializer;
1014

@@ -37,5 +41,19 @@ public void testCollections () {
3741
roundTrip(8, 8, list("1", "2", "3"));
3842
serializer.setElementsCanBeNull(false);
3943
roundTrip(8, 8, list("1", "2", "3"));
44+
45+
kryo.register(TreeSet.class);
46+
TreeSet set = new TreeSet();
47+
set.add("1");
48+
set.add("2");
49+
roundTrip(9, 9, set);
50+
51+
kryo.register(KeyThatIsntComparable.class);
52+
kryo.register(KeyComparator.class);
53+
set = new TreeSet(new KeyComparator());
54+
set.add(new KeyThatIsntComparable("1"));
55+
set.add(new KeyThatIsntComparable("2"));
56+
roundTrip(9, 9, set);
4057
}
58+
4159
}

test/com/esotericsoftware/kryo/MapSerializerTest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,5 +147,10 @@ public int compare (KeyThatIsntComparable o1, KeyThatIsntComparable o2) {
147147

148148
static public class KeyThatIsntComparable {
149149
public String value;
150+
public KeyThatIsntComparable () {
151+
}
152+
public KeyThatIsntComparable (String value) {
153+
this.value = value;
154+
}
150155
}
151156
}

0 commit comments

Comments
 (0)