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