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 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 EndianUtil endianUtil) throws SerializationException
46 {
47 buffer[pointer.getAndIncrement(1)] = endianUtil.isBigEndian() ? fieldType() : (byte) (fieldType() + 128);
48 serialize(object, buffer, pointer, endianUtil);
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 EndianUtil endianUtil)
77 {
78 SerializationUnits unitType = SerializationUnits.getUnitType(unit);
79 message[pointer.getAndIncrement(1)] = unitType.getCode();
80 DisplayType displayType = DisplayType.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 EndianUtil endianUtil)
93 {
94 SerializationUnits unitType = SerializationUnits.getUnitType(buffer[pointer.getAndIncrement(1)]);
95 DisplayType displayType = DisplayType.getDisplayType(unitType, 0 + buffer[pointer.getAndIncrement(1)]);
96 return (U) displayType.getDjunitsType();
97 }
98
99 }