1 package org.djutils.serialization.serializers;
2
3 import java.lang.reflect.Array;
4
5 import org.djutils.serialization.EndianUtil;
6 import org.djutils.serialization.SerializationException;
7
8
9
10
11
12
13
14
15
16
17
18
19 public abstract class ObjectArraySerializer<E extends Object> extends ArrayOrMatrixSerializer<E[], E>
20 {
21
22 private final E sample;
23
24
25
26
27
28
29
30
31 public ObjectArraySerializer(final byte type, final int dataSize, final E sample, final String dataClassName)
32 {
33 super(type, dataSize, dataClassName, 1);
34 this.sample = sample;
35 }
36
37 @Override
38 public final int size(final E[] array)
39 {
40 return 4 + getElementSize() * array.length;
41 }
42
43 @Override
44 public final int sizeWithPrefix(final E[] array)
45 {
46 return 1 + size(array);
47 }
48
49 @Override
50 public final void serializeWithPrefix(final E[] array, final byte[] buffer, final Pointer pointer,
51 final EndianUtil endianUtil) throws SerializationException
52 {
53 buffer[pointer.getAndIncrement(1)] = fieldType();
54 serialize(array, buffer, pointer, endianUtil);
55 }
56
57 @Override
58 public final void serialize(final E[] array, final byte[] buffer, final Pointer pointer, final EndianUtil endianUtil)
59 {
60 endianUtil.encodeInt(array.length, buffer, pointer.getAndIncrement(4));
61 for (int i = 0; i < array.length; i++)
62 {
63 serializeElement(array[i], buffer, pointer.getAndIncrement(getElementSize()), endianUtil);
64 }
65 }
66
67 @Override
68 public final E[] deSerialize(final byte[] buffer, final Pointer pointer, final EndianUtil endianUtil)
69 {
70 int size = endianUtil.decodeInt(buffer, pointer.getAndIncrement(4));
71 @SuppressWarnings("unchecked")
72 E[] result = (E[]) Array.newInstance(this.sample.getClass(), size);
73 for (int i = 0; i < size; i++)
74 {
75 result[i] = deSerializeElement(buffer, pointer.getAndIncrement(getElementSize()), endianUtil);
76 }
77 return result;
78 }
79
80 }