1 package org.djutils.serialization.serializers;
2
3 import org.djunits.unit.Unit;
4 import org.djunits.unit.scale.IdentityScale;
5 import org.djunits.value.ValueRuntimeException;
6 import org.djunits.value.storage.StorageType;
7 import org.djunits.value.vfloat.scalar.base.FloatScalarInterface;
8 import org.djunits.value.vfloat.vector.base.FloatVector;
9 import org.djunits.value.vfloat.vector.base.FloatVectorInterface;
10 import org.djunits.value.vfloat.vector.data.FloatVectorData;
11 import org.djutils.serialization.EndianUtil;
12 import org.djutils.serialization.FieldTypes;
13 import org.djutils.serialization.SerializationException;
14
15
16
17
18
19
20
21
22
23
24
25
26 public class FloatVectorSerializer<U extends Unit<U>, S extends FloatScalarInterface<U, S>,
27 V extends FloatVectorInterface<U, S, V>> extends ArrayOrMatrixWithUnitSerializer<U, V>
28 {
29
30 public FloatVectorSerializer()
31 {
32 super(FieldTypes.FLOAT_32_UNIT_ARRAY, "Djunits_FloatVector", 1);
33 }
34
35
36 @Override
37 public int size(final V afv) throws SerializationException
38 {
39 try
40 {
41 return 4 + 2 + 4 * afv.size();
42 }
43 catch (ValueRuntimeException e)
44 {
45 throw new SerializationException(e);
46 }
47 }
48
49
50 @Override
51 public void serialize(final V afv, final byte[] buffer, final Pointer pointer, final EndianUtil endianUtil)
52 throws SerializationException
53 {
54 try
55 {
56 endianUtil.encodeInt(afv.size(), buffer, pointer.getAndIncrement(4));
57 encodeUnit(afv.getDisplayUnit(), buffer, pointer, endianUtil);
58 for (int i = 0; i < afv.size(); i++)
59 {
60 endianUtil.encodeFloat(afv.get(i).getSI(), buffer, pointer.getAndIncrement(4));
61 }
62 }
63 catch (ValueRuntimeException e)
64 {
65 throw new SerializationException(e);
66 }
67 }
68
69
70 @Override
71 public V deSerialize(final byte[] buffer, final Pointer pointer, final EndianUtil endianUtil) throws SerializationException
72 {
73 int size = endianUtil.decodeInt(buffer, pointer.getAndIncrement(4));
74 Unit<?> unit = getUnit(buffer, pointer, endianUtil);
75 float[] array = new float[size];
76 for (int i = 0; i < size; i++)
77 {
78 array[i] = endianUtil.decodeFloat(buffer, pointer.getAndIncrement(4));
79 }
80 try
81 {
82 FloatVectorData fvd = FloatVectorData.instantiate(array, IdentityScale.SCALE, StorageType.DENSE);
83 return FloatVector.instantiateAnonymous(fvd, unit);
84 }
85 catch (ValueRuntimeException exception)
86 {
87 throw new SerializationException(exception);
88 }
89 }
90
91 }