View Javadoc
1   package org.djutils.serialization.serializers;
2   
3   import java.lang.reflect.Array;
4   
5   import org.djutils.serialization.EndianUtil;
6   import org.djutils.serialization.SerializationException;
7   
8   /**
9    * Serializer for Object array classes.
10   * <p>
11   * Copyright (c) 2019-2022 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
12   * BSD-style license. See <a href="https://djutils.org/docs/current/djutils/licenses.html">DJUTILS License</a>.
13   * <p>
14   * @version $Revision$, $LastChangedDate$, by $Author$, <br>
15   * @author <a href="https://www.tudelft.nl/averbraeck">Alexander Verbraeck</a>
16   * @author <a href="https://www.tudelft.nl/staff/p.knoppers/">Peter Knoppers</a>
17   * @param <E> class of the element object
18   */
19  public abstract class ObjectArraySerializer<E extends Object> extends ArrayOrMatrixSerializer<E[], E>
20  {
21      /** Sample object with required type info (zero length array suffices). */
22      private final E sample;
23  
24      /**
25       * Construct a new ObjectArraySerializer.
26       * @param type byte; the field type (returned by the <code>fieldType</code> method)
27       * @param dataSize int; the number of bytes needed to encode one additional array element
28       * @param sample E; sample object (can be zero length array).
29       * @param dataClassName String; returned by the dataClassName method
30       */
31      public ObjectArraySerializer(final byte type, final int dataSize, final E sample, final String dataClassName)
32      {
33          super(type, dataSize, dataClassName, 1);
34          this.sample = sample;
35      }
36  
37      @Override
38      public final int size(final E[] array)
39      {
40          return 4 + getElementSize() * array.length;
41      }
42  
43      @Override
44      public final int sizeWithPrefix(final E[] array)
45      {
46          return 1 + size(array);
47      }
48  
49      @Override
50      public final void serializeWithPrefix(final E[] array, final byte[] buffer, final Pointer pointer,
51              final EndianUtil endianUtil) throws SerializationException
52      {
53          buffer[pointer.getAndIncrement(1)] = fieldType();
54          serialize(array, buffer, pointer, endianUtil);
55      }
56  
57      @Override
58      public final void serialize(final E[] array, final byte[] buffer, final Pointer pointer, final EndianUtil endianUtil)
59      {
60          endianUtil.encodeInt(array.length, buffer, pointer.getAndIncrement(4));
61          for (int i = 0; i < array.length; i++)
62          {
63              serializeElement(array[i], buffer, pointer.getAndIncrement(getElementSize()), endianUtil);
64          }
65      }
66  
67      @Override
68      public final E[] deSerialize(final byte[] buffer, final Pointer pointer, final EndianUtil endianUtil)
69      {
70          int size = endianUtil.decodeInt(buffer, pointer.getAndIncrement(4));
71          @SuppressWarnings("unchecked")
72          E[] result = (E[]) Array.newInstance(this.sample.getClass(), size);
73          for (int i = 0; i < size; i++)
74          {
75              result[i] = deSerializeElement(buffer, pointer.getAndIncrement(getElementSize()), endianUtil);
76          }
77          return result;
78      }
79  
80  }