1 package org.djutils.serialization.serializers;
2
3 import org.djutils.serialization.EndianUtil;
4
5 /**
6 * Serializer for arrays or matrices.
7 * @param <T> type; with [] or [][]
8 * @param <E> type without [] or [][]
9 */
10 public abstract class ArrayOrMatrixSerializer<T extends Object, E extends Object> extends BasicSerializer<T>
11 {
12 /** Size of one element of the encoded data. */
13 private final int elementSize;
14
15 /** Number of dimension; 1 for array, 2 for matrix. */
16 private final int numberOfDimensions;
17
18 /**
19 * Construct a new ArrayOrMatrixSerializere.
20 * @param type byte; the field type (returned by the <code>fieldType</code> method)
21 * @param elementSize int; the number of bytes needed to encode one additional array, or matrix element
22 * @param dataClassName String; returned by the dataClassName method
23 * @param numberOfDimensions int; should be 1 for array serializer and 2 for matrix serializer
24 */
25 ArrayOrMatrixSerializer(final byte type, final int elementSize, final String dataClassName, final int numberOfDimensions)
26 {
27 super(type, dataClassName);
28 this.elementSize = elementSize;
29 this.numberOfDimensions = numberOfDimensions;
30 }
31
32 /**
33 * Return the number of bytes needed to encode one additional element.
34 * @return int; the number of bytes needed to encode one additional element
35 */
36 public final int getElementSize()
37 {
38 return this.elementSize;
39 }
40
41 /**
42 * Return the number of dimensions of the stored data.
43 * @return int; 1 for array, 2 for matrix
44 */
45 @Override
46 public final int getNumberOfDimensions()
47 {
48 return this.numberOfDimensions;
49 }
50
51 /**
52 * Serializer for one array or matrix element (without type prefix) must be implemented in implementing sub classes.
53 * @param object E; the object to serialize
54 * @param buffer byte[]; the byte buffer for the serialized object
55 * @param offset int; index in byte buffer where first serialized byte must be stored
56 * @param endianUtil EndianUtil; selects bigEndian or littleEndian encoding
57 */
58 public abstract void serializeElement(E object, byte[] buffer, int offset, EndianUtil endianUtil);
59
60 /**
61 * Deserializer for one array or matrix element (without type prefix) must be implemented in implementing sub classes.
62 * @param buffer byte[]; the byte buffer from which the object is to be deserialized
63 * @param offset int; index in byte buffer where first byte of the object is stored
64 * @param endianUtil EndianUtil; selects bigEndian or littleEndian encoding
65 * @return E; the deserialized object
66 */
67 public abstract E deSerializeElement(byte[] buffer, int offset, EndianUtil endianUtil);
68
69 }