]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.databoard/src/org/simantics/databoard/serialization/impl/UTF8StringSerializer.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.databoard / src / org / simantics / databoard / serialization / impl / UTF8StringSerializer.java
1 package org.simantics.databoard.serialization.impl;\r
2 \r
3 import java.io.DataInput;\r
4 import java.io.DataOutput;\r
5 import java.io.IOException;\r
6 \r
7 import org.simantics.databoard.binding.StringBinding;\r
8 import org.simantics.databoard.binding.error.BindingException;\r
9 import org.simantics.databoard.serialization.Serializer.NonRecursiveSerializer;\r
10 import org.simantics.databoard.util.binary.Endian;\r
11 import org.simantics.databoard.util.binary.UTF8;\r
12 \r
13 /**\r
14  * Serializes Strings to UTF8 strings\r
15  * \r
16  * @author Toni Kalajainen\r
17  */\r
18 public class UTF8StringSerializer extends NonRecursiveSerializer {\r
19 \r
20         \r
21         StringBinding binding;\r
22         \r
23         public UTF8StringSerializer(StringBinding binding) {\r
24                 this.binding = binding;\r
25         }\r
26 \r
27         @Override\r
28         public Object deserialize(DataInput in) throws IOException {\r
29                 try {\r
30                         int length = Endian.readDynamicUInt32(in);\r
31                         assertRemainingBytes(in, length); \r
32                         String str = UTF8.readUTF(in, length);\r
33                         return binding.create(str);\r
34                 } catch (BindingException e) {\r
35                         throw new IOException( e ); \r
36                 }\r
37         }\r
38         \r
39         @Override\r
40         public void deserializeTo(DataInput in, Object obj) throws IOException {\r
41                 try {\r
42                         int length = Endian.readDynamicUInt32(in);\r
43                         assertRemainingBytes(in, length); \r
44                         String str = UTF8.readUTF(in, length);\r
45                         binding.setValue(obj, str);\r
46                 } catch (BindingException e) {\r
47                         throw new IOException( e ); \r
48                 }\r
49         }\r
50 \r
51         @Override\r
52         public void skip(DataInput in) throws IOException {             \r
53                 int length = Endian.readDynamicUInt32(in);\r
54                 in.skipBytes(length);\r
55         }\r
56         \r
57         @Override\r
58         public void serialize(DataOutput out, Object obj) throws IOException {\r
59                 try {\r
60                         byte[] bytes = binding.getValue(obj).getBytes(UTF8.CHARSET);\r
61                         Endian.writeDynamicUInt32(out, bytes.length);   \r
62                         out.write(bytes);\r
63                 } catch (BindingException e) {\r
64                         throw new IOException( e ); \r
65                 }\r
66         }\r
67 \r
68         @Override\r
69         public Integer getConstantSize() {                      \r
70                 return null;\r
71         }\r
72 \r
73         @Override\r
74         public int getSize(Object obj) throws IOException {\r
75                 try {\r
76                         String string = binding.getValue(obj);\r
77                         int stringByteLength = UTF8.getUTF8EncodingByteLength( string ); \r
78                         int lengthLength = Endian.getDynamicUInt32Length( stringByteLength );                           \r
79                         return lengthLength + stringByteLength;\r
80                 } catch (BindingException e) {\r
81                         throw new IOException( e ); \r
82                 }\r
83         }\r
84 \r
85         @Override\r
86         public int getMinSize() {\r
87                 return 1;\r
88         }\r
89         \r
90 }\r
91 \r