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.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
15 * Serializes strings to Modified UTF-8,
\r
16 * see http://download.oracle.com/javase/6/docs/api/java/io/DataInput.html
\r
18 * @author Toni Kalajainen
\r
20 public class ModifiedUTF8StringSerializer extends NonRecursiveSerializer {
\r
22 StringBinding binding;
\r
24 public ModifiedUTF8StringSerializer(StringBinding binding) {
\r
25 this.binding = binding;
\r
29 public Object deserialize(DataInput in) throws IOException {
\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
42 public void deserializeTo(DataInput in, Object obj) throws IOException {
\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
54 public void skip(DataInput in) throws IOException, SerializationException {
\r
55 int length = Endian.readDynamicUInt32(in);
\r
56 in.skipBytes(length);
\r
60 public void serialize(DataOutput out, Object obj) throws IOException {
\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
72 public Integer getConstantSize() {
\r
77 public int getSize(Object obj) throws IOException {
\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
89 public int getMinSize() {
\r