1 package org.simantics.databoard.serialization.impl;
3 import java.io.DataInput;
4 import java.io.DataOutput;
5 import java.io.IOException;
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;
14 * Serializes Strings to UTF8 strings
16 * @author Toni Kalajainen
18 public class UTF8StringSerializer extends NonRecursiveSerializer {
21 StringBinding binding;
23 public UTF8StringSerializer(StringBinding binding) {
24 this.binding = binding;
28 public Object deserialize(DataInput in) throws IOException {
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 );
40 public void deserializeTo(DataInput in, Object obj) throws IOException {
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 );
52 public void skip(DataInput in) throws IOException {
53 int length = Endian.readDynamicUInt32(in);
58 public void serialize(DataOutput out, Object obj) throws IOException {
60 byte[] bytes = binding.getValue(obj).getBytes(UTF8.CHARSET);
61 Endian.writeDynamicUInt32(out, bytes.length);
63 } catch (BindingException e) {
64 throw new IOException( e );
69 public Integer getConstantSize() {
74 public int getSize(Object obj) throws IOException {
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 );
86 public int getMinSize() {