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)] = fieldType();
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
62
63
64 protected void encodeUnit(final U unit, final byte[] message, final Pointer pointer, final EndianUtil endianUtil)
65 {
66 SerializationUnits unitType = SerializationUnits.getUnitType(unit);
67 message[pointer.getAndIncrement(1)] = unitType.getCode();
68 DisplayType displayType = DisplayType.getDisplayType(unit);
69 message[pointer.getAndIncrement(1)] = displayType.getByteCode();
70 }
71
72
73
74
75
76
77
78
79 @SuppressWarnings("unchecked")
80 protected U getUnit(final byte[] buffer, final Pointer pointer, final EndianUtil endianUtil)
81 {
82 SerializationUnits unitType = SerializationUnits.getUnitType(buffer[pointer.getAndIncrement(1)]);
83 DisplayType displayType = DisplayType.getDisplayType(unitType, 0 + buffer[pointer.getAndIncrement(1)]);
84 return (U) displayType.getDjunitsType();
85 }
86
87 }