1 package org.djutils.serialization.serializers;
2
3 import org.djunits.unit.Unit;
4 import org.djutils.serialization.DisplayType;
5 import org.djutils.serialization.EndianUtil;
6 import org.djutils.serialization.SerializationException;
7 import org.djutils.serialization.SerializationUnits;
8
9
10
11
12
13
14
15
16
17
18
19
20
21 public abstract class ArrayOrMatrixWithUnitSerializer<U extends Unit<U>, T> extends BasicSerializer<T>
22 {
23
24 private final int numberOfDimensions;
25
26
27
28
29
30
31
32 public ArrayOrMatrixWithUnitSerializer(final byte type, final String dataClassName, final int numberOfDimensions)
33 {
34 super(type, dataClassName);
35 this.numberOfDimensions = numberOfDimensions;
36 }
37
38 @Override
39 public final int sizeWithPrefix(final T object) throws SerializationException
40 {
41 return 1 + size(object);
42 }
43
44 @Override
45 public final void serializeWithPrefix(final T object, final byte[] buffer, final Pointer pointer,
46 final EndianUtil endianUtil) throws SerializationException
47 {
48 buffer[pointer.getAndIncrement(1)] = fieldType();
49 serialize(object, buffer, pointer, endianUtil);
50 }
51
52 @Override
53 public final int getNumberOfDimensions()
54 {
55 return this.numberOfDimensions;
56 }
57
58
59
60
61
62
63
64
65 protected void encodeUnit(final U unit, final byte[] message, final Pointer pointer, final EndianUtil endianUtil)
66 {
67 SerializationUnits unitType = SerializationUnits.getUnitType(unit);
68 message[pointer.getAndIncrement(1)] = unitType.getCode();
69 DisplayType displayType = DisplayType.getDisplayType(unit);
70 message[pointer.getAndIncrement(1)] = displayType.getByteCode();
71 }
72
73
74
75
76
77
78
79
80 @SuppressWarnings("unchecked")
81 protected U getUnit(final byte[] buffer, final Pointer pointer, final EndianUtil endianUtil)
82 {
83 SerializationUnits unitType = SerializationUnits.getUnitType(buffer[pointer.getAndIncrement(1)]);
84 DisplayType displayType = DisplayType.getDisplayType(unitType, 0 + buffer[pointer.getAndIncrement(1)]);
85 return (U) displayType.getDjunitsType();
86 }
87
88 }