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