1 package org.djutils.serialization.serializers;
2
3 import org.djutils.serialization.EndianUtil;
4 import org.djutils.serialization.SerializationException;
5
6 /**
7 * Serializer for primitive data array classes. *
8 * <p>
9 * Copyright (c) 2019-2023 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
10 * BSD-style license. See <a href="https://djutils.org/docs/current/djutils/licenses.html">DJUTILS License</a>.
11 * <p>
12 * @version $Revision$, $LastChangedDate$, by $Author$, <br>
13 * @author <a href="https://www.tudelft.nl/averbraeck">Alexander Verbraeck</a>
14 * @author <a href="https://www.tudelft.nl/staff/p.knoppers/">Peter Knoppers</a>
15 * @param <T> array type, e.g. int[]
16 */
17 public abstract class BasicPrimitiveArrayOrMatrixSerializer<T extends Object> extends BasicSerializer<T>
18 {
19 /** Size of one element of the encoded data. */
20 private final int elementSize;
21
22 /** Number of dimensions of the data. */
23 private final int numberOfDimensions;
24
25 /**
26 * Construct a new BasicPrimitiveArrayOrMatrixSerializer.
27 * @param type byte; the field type (returned by the <code>fieldType</code> method)
28 * @param elementSize int; the number of bytes needed to encode one additional array element
29 * @param dataClassName String; returned by the dataClassName method
30 * @param numberOfDimensions int; number of dimensions (1 for array, 2 for matrix)
31 */
32 public BasicPrimitiveArrayOrMatrixSerializer(final byte type, final int elementSize, final String dataClassName,
33 final int numberOfDimensions)
34 {
35 super(type, dataClassName);
36 this.elementSize = elementSize;
37 this.numberOfDimensions = numberOfDimensions;
38 }
39
40 @Override
41 public final int sizeWithPrefix(final T object) throws SerializationException
42 {
43 return 1 + size(object);
44 }
45
46 @Override
47 public final void serializeWithPrefix(final T object, final byte[] buffer, final Pointer pointer,
48 final EndianUtil endianUtil) throws SerializationException
49 {
50 buffer[pointer.getAndIncrement(1)] = fieldType();
51 serialize(object, buffer, pointer, endianUtil);
52 }
53
54 /**
55 * Retrieve the number of bytes needed to encode one additional array element.
56 * @return int; the number of bytes needed to encode one additional array element
57 */
58 public final int getElementSize()
59 {
60 return this.elementSize;
61 }
62
63 @Override
64 public final int getNumberOfDimensions()
65 {
66 return this.numberOfDimensions;
67 }
68
69 }