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