View Javadoc
1   package org.djutils.serialization;
2   
3   import org.djutils.exceptions.Throw;
4   
5   /**
6    * Serializable name for the next item in the stream, data, whatever. This serializer serializes strings that are no longer than
7    * 255 characters and contain only one-byte ASCII characters.
8    * <p>
9    * Copyright (c) 2019-2019 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
10   * BSD-style license. See <a href="http://sim0mq.org/docs/current/license.html">OpenTrafficSim License</a>.
11   * </p>
12   * $LastChangedDate: 2015-07-24 02:58:59 +0200 (Fri, 24 Jul 2015) $, @version $Revision: 1147 $, by $Author: averbraeck $,
13   * initial version Jun 18, 2019 <br>
14   * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a>
15   * @author <a href="http://www.tudelft.nl/pknoppers">Peter Knoppers</a>
16   */
17  public class ItemName implements Serializer<String>
18  {
19      /** The string (not final; because it can be modified by calling the deSerialize method). */
20      private String string;
21  
22      /**
23       * Construct a new ItemName.
24       * @param string String; name of the item
25       * @throws SerializationException when the <code>string</code> is too long, or contains illegal characters
26       */
27      public ItemName(final String string) throws SerializationException
28      {
29          Throw.when(string.length() > 255, SerializationException.class, "ItemName may not be longer than 255 characters");
30          for (int i = 0; i < string.length(); i++)
31          {
32              Throw.when(string.charAt(i) > 255, SerializationException.class, "Character at position %d is out of range", i);
33          }
34          this.string = string;
35      }
36  
37      /**
38       * Construct a new ItemName from serialized data.
39       * @param buffer byte[]; the data
40       * @param pointer Pointer; position in the data
41       */
42      public ItemName(final byte[] buffer, final Pointer pointer)
43      {
44          deSerialize(buffer, pointer, null);
45      }
46  
47      /** {@inheritDoc} */
48      @Override
49      public int size(final String object) throws SerializationException
50      {
51          return 1 + this.string.length();
52      }
53  
54      /** {@inheritDoc} */
55      @Override
56      public int sizeWithPrefix(final String object) throws SerializationException
57      {
58          return 1 + size(object);
59      }
60  
61      /** {@inheritDoc} */
62      @Override
63      public byte fieldType()
64      {
65          return 33;
66      }
67  
68      /** {@inheritDoc} */
69      @Override
70      public void serialize(final String object, final byte[] buffer, final Pointer pointer, final EndianUtil endianUtil)
71              throws SerializationException
72      {
73          buffer[pointer.getAndIncrement(1)] = (byte) this.string.length();
74          for (int i = 0; i < this.string.length(); i++)
75          {
76              buffer[pointer.getAndIncrement(1)] = (byte) (this.string.charAt(i) & 0xff);
77          }
78      }
79  
80      /** {@inheritDoc} */
81      @Override
82      public void serializeWithPrefix(final String object, final byte[] buffer, final Pointer pointer,
83              final EndianUtil endianUtil) throws SerializationException
84      {
85          buffer[pointer.getAndIncrement(1)] = fieldType();
86          serialize(object, buffer, pointer, endianUtil);
87      }
88  
89      /** {@inheritDoc} */
90      @Override
91      public String deSerialize(final byte[] buffer, final Pointer pointer, final EndianUtil endianUtil)
92      {
93          int length = buffer[pointer.getAndIncrement(1)] & 0xff;
94          char[] chars = new char[length];
95          for (int i = 0; i < length; i++)
96          {
97              chars[i] = (char) (buffer[pointer.getAndIncrement(1)] & 0xff);
98          }
99          this.string = new String(chars);
100         return this.string;
101     }
102 
103     /** {@inheritDoc} */
104     @Override
105     public String dataClassName()
106     {
107         return "Name";
108     }
109 
110     @Override
111     public final int getNumberOfDimensions()
112     {
113         return 0;
114     }
115 
116 }