Skip to content

Commit 6d71f7a

Browse files
committed
Ability to (de-)serialize Set and Queue
1 parent 3f412df commit 6d71f7a

File tree

5 files changed

+88
-13
lines changed

5 files changed

+88
-13
lines changed

src/main/java/net/elytrium/serializer/language/reader/AbstractReader.java

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,12 @@
2424
import java.lang.reflect.ParameterizedType;
2525
import java.lang.reflect.Type;
2626
import java.util.ArrayDeque;
27+
import java.util.Collection;
2728
import java.util.Deque;
2829
import java.util.List;
2930
import java.util.Map;
3031
import java.util.Queue;
32+
import java.util.Set;
3133
import java.util.logging.Level;
3234
import java.util.logging.Logger;
3335
import javax.annotation.Nullable;
@@ -196,12 +198,22 @@ public Object readByType(@Nullable Field owner, @Nullable Object holder, Type ty
196198
return this.readGuessingType(owner);
197199
} else if (type instanceof ParameterizedType parameterizedType) {
198200
Class<?> clazz = (Class<?>) parameterizedType.getRawType();
199-
return Map.class.isAssignableFrom(clazz) ? this.readMap(owner,
200-
GenericUtils.getParameterType(Map.class, parameterizedType, 0),
201-
GenericUtils.getParameterType(Map.class, parameterizedType, 1))
202-
: List.class.isAssignableFrom(clazz) ? this.readList(owner,
203-
GenericUtils.getParameterType(List.class, parameterizedType, 0))
204-
: this.readGuessingType(owner);
201+
if (Map.class.isAssignableFrom(clazz)) {
202+
return this.readMap(owner,
203+
GenericUtils.getParameterType(Map.class, parameterizedType, 0),
204+
GenericUtils.getParameterType(Map.class, parameterizedType, 1));
205+
} else if (Collection.class.isAssignableFrom(clazz)) {
206+
Type collectionType = GenericUtils.getParameterType(Collection.class, parameterizedType, 0);
207+
if (Set.class.isAssignableFrom(clazz)) {
208+
return this.readSet(collectionType);
209+
} else if (Queue.class.isAssignableFrom(clazz)) {
210+
return this.readDeque(collectionType);
211+
} else {
212+
return this.readList(collectionType);
213+
}
214+
} else {
215+
return this.readGuessingType(owner);
216+
}
205217
} else if (type instanceof Class<?> clazz) {
206218
if (Map.class.isAssignableFrom(clazz)) {
207219
return this.readMap(owner);
@@ -272,6 +284,26 @@ public List<Object> readList(Type type) {
272284

273285
public abstract List<Object> readList(@Nullable Field owner, Type type);
274286

287+
public Set<Object> readSet(@Nullable Field owner) {
288+
return this.readSet(owner, Object.class);
289+
}
290+
291+
public Set<Object> readSet(Type type) {
292+
return this.readSet(null, type);
293+
}
294+
295+
public abstract Set<Object> readSet(@Nullable Field owner, Type type);
296+
297+
public Deque<Object> readDeque(@Nullable Field owner) {
298+
return this.readDeque(owner, Object.class);
299+
}
300+
301+
public Deque<Object> readDeque(Type type) {
302+
return this.readDeque(null, type);
303+
}
304+
305+
public abstract Deque<Object> readDeque(@Nullable Field owner, Type type);
306+
275307
public String readString() {
276308
return this.readString(null);
277309
}

src/main/java/net/elytrium/serializer/language/reader/YamlReader.java

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,11 @@
2828
import java.util.Collection;
2929
import java.util.Deque;
3030
import java.util.HashMap;
31+
import java.util.HashSet;
3132
import java.util.LinkedHashMap;
3233
import java.util.List;
3334
import java.util.Map;
35+
import java.util.Set;
3436
import java.util.logging.Level;
3537
import java.util.logging.Logger;
3638
import net.elytrium.serializer.SerializerConfig;
@@ -269,6 +271,20 @@ public List<Object> readList(@Nullable Field owner, Type type) {
269271
}
270272
}
271273

274+
@Override
275+
public Set<Object> readSet(@Nullable Field owner, Type type) {
276+
synchronized (this) {
277+
return this.readListByMarker(new HashSet<>(), owner, type, this.readRawIgnoreEmpty());
278+
}
279+
}
280+
281+
@Override
282+
public Deque<Object> readDeque(@Nullable Field owner, Type type) {
283+
synchronized (this) {
284+
return this.readListByMarker(new ArrayDeque<>(), owner, type, this.readRawIgnoreEmpty());
285+
}
286+
}
287+
272288
@Override
273289
public Character readCharacter(@Nullable Field owner) {
274290
synchronized (this) {
@@ -397,13 +413,16 @@ public Long readLong(@Nullable Field owner) throws NumberFormatException {
397413
}
398414
}
399415

400-
@SuppressFBWarnings("SA_FIELD_SELF_COMPARISON")
401416
private List<Object> readListByMarker(@Nullable Field owner, Type type, char marker) {
417+
return this.readListByMarker(new ArrayList<>(), owner, type, marker);
418+
}
419+
420+
@SuppressFBWarnings("SA_FIELD_SELF_COMPARISON")
421+
private <C extends Collection<Object>> C readListByMarker(C result, @Nullable Field owner, Type type, char marker) {
402422
if (this.skipComments(owner, marker, false)) {
403423
marker = AbstractReader.NEW_LINE;
404424
}
405425

406-
List<Object> result = new ArrayList<>();
407426
switch (marker) {
408427
case '[': {
409428
char nextMarker = this.readRawIgnoreEmptyAndNewLines();

src/main/java/net/elytrium/serializer/language/writer/AbstractWriter.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
import java.io.IOException;
2222
import java.lang.reflect.Field;
2323
import java.lang.reflect.Modifier;
24-
import java.util.List;
24+
import java.util.Collection;
2525
import java.util.Map;
2626
import java.util.Set;
2727
import java.util.stream.Stream;
@@ -286,8 +286,8 @@ public void writeNode(@Nullable Field owner, Object value, Comment[] comments) {
286286
value = this.serializeValue(value);
287287
if (value instanceof Map) {
288288
this.writeMap(owner, (Map<Object, Object>) value, comments);
289-
} else if (value instanceof List) {
290-
this.writeList(owner, (List<Object>) value, comments);
289+
} else if (value instanceof Collection<?>) {
290+
this.writeList(owner, (Collection<Object>) value, comments);
291291
} else if (value instanceof String) {
292292
this.writeString(owner, (String) value);
293293
} else if (value instanceof Character) {
@@ -364,11 +364,11 @@ public void writeEndMap() {
364364

365365
public abstract void writeEndMap(@Nullable Field owner);
366366

367-
public void writeList(List<Object> value, Comment[] comments) {
367+
public void writeList(Collection<Object> value, Comment[] comments) {
368368
this.writeList(null, value, comments);
369369
}
370370

371-
public void writeList(@Nullable Field owner, List<Object> value, Comment[] comments) {
371+
public void writeList(@Nullable Field owner, Collection<Object> value, Comment[] comments) {
372372
synchronized (this) {
373373
if (value.isEmpty()) {
374374
this.writeEmptyList(owner);

src/test/java/net/elytrium/serializer/SerializerTest.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,15 @@
2727
import java.nio.file.Files;
2828
import java.nio.file.Path;
2929
import java.nio.file.Paths;
30+
import java.util.ArrayDeque;
3031
import java.util.Arrays;
3132
import java.util.Date;
33+
import java.util.Deque;
34+
import java.util.HashSet;
3235
import java.util.LinkedHashMap;
3336
import java.util.List;
3437
import java.util.Map;
38+
import java.util.Set;
3539
import net.elytrium.serializer.annotations.Comment;
3640
import net.elytrium.serializer.annotations.CommentValue;
3741
import net.elytrium.serializer.annotations.Final;
@@ -107,6 +111,9 @@ void testConfig() throws IOException {
107111
Assertions.assertEquals(Math.E, settings.regularDoubleField);
108112
Assertions.assertNull(settings.nullField);
109113
Assertions.assertEquals(RegularEnum.TRUE, settings.enumField);
114+
Assertions.assertEquals(3, settings.regularList.size());
115+
Assertions.assertEquals(2, settings.regularSet.size());
116+
Assertions.assertEquals(3, settings.regularDeque.size());
110117
Assertions.assertEquals("string value", settings.prepend.stringField);
111118
Assertions.assertEquals("string value", settings.prepend.fieldWithCommentAtSameLine);
112119
Assertions.assertEquals("string value", settings.prepend.stringField);
@@ -302,6 +309,12 @@ public String deserialize(String from) {
302309

303310
public RegularEnum enumField = RegularEnum.TRUE;
304311

312+
public List<String> regularList = Arrays.asList("123", "123", "456");
313+
314+
public Set<String> regularSet = new HashSet<>(Arrays.asList("123", "123", "456"));
315+
316+
public Deque<String> regularDeque = new ArrayDeque<>(Arrays.asList("123", "123", "456"));
317+
305318
@RegisterPlaceholders({"{TEST}", "TEST2"})
306319
public String stringWithPlaceholders = "This is {TEST} with {TEST2}";
307320

src/test/resources/config.yml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,17 @@ regular-float-field: 3.1415927
1111
regular-double-field: 2.718281828459045
1212
null-field: null
1313
enum-field: ENUM_VALUE_1
14+
regular-list:
15+
- "123"
16+
- "123"
17+
- "456"
18+
regular-set:
19+
- "123"
20+
- "456"
21+
regular-deque:
22+
- "123"
23+
- "123"
24+
- "456"
1425
string-with-placeholders: "This is {TEST} with {TEST2}"
1526
string-with-placeholders-2: "This is {test} with {test2}"
1627
another-string-with-placeholders: "PLACEHOLDER another-placeholder"

0 commit comments

Comments
 (0)