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  }