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