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