--- /dev/null
+/*******************************************************************************\r
+ * Copyright (c) 2010 Association for Decentralized Information Management in\r
+ * Industry THTH ry.\r
+ * All rights reserved. This program and the accompanying materials\r
+ * are made available under the terms of the Eclipse Public License v1.0\r
+ * which accompanies this distribution, and is available at\r
+ * http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ * Contributors:\r
+ * VTT Technical Research Centre of Finland - initial API and implementation\r
+ *******************************************************************************/\r
+package org.simantics.databoard.example.old;
+
+import gnu.trove.map.hash.TObjectIntHashMap;\r
+\r
+import java.awt.geom.Rectangle2D;\r
+import java.io.DataInput;\r
+import java.io.DataOutput;\r
+import java.io.IOException;\r
+import java.nio.ByteBuffer;\r
+import java.util.ArrayList;\r
+\r
+import org.simantics.databoard.Bindings;\r
+import org.simantics.databoard.Datatypes;\r
+import org.simantics.databoard.binding.Binding;\r
+import org.simantics.databoard.binding.error.BindingConstructionException;\r
+import org.simantics.databoard.binding.error.BindingException;\r
+import org.simantics.databoard.binding.error.DatatypeConstructionException;\r
+import org.simantics.databoard.serialization.SerializationException;\r
+import org.simantics.databoard.serialization.Serializer;\r
+import org.simantics.databoard.serialization.Serializer.NonRecursiveSerializer;\r
+import org.simantics.databoard.serialization.SerializerConstructionException;\r
+import org.simantics.databoard.type.Datatype;\r
+import org.simantics.databoard.util.binary.BinaryReadable;\r
+import org.simantics.databoard.util.binary.BinaryWriteable;\r
+import org.simantics.databoard.util.binary.ByteBufferReadable;\r
+import org.simantics.databoard.util.binary.ByteBufferWriteable;\r
+
+/**
+ * {@link Serializer} is a link between a {@link Binding} and a binary data.
+ * {@link Binding#serializer(SerializationFormat)} creates Serializer object
+ * which is based on the binding. Although the performance is good, it can be
+ * improved by writing a taylored serializer by hand.
+ * <p>
+ * The example demonstrates how to write create hand-written
+ * {@link Serializer} implementation to {@link Rectangle2D}.
+ *
+ * @author Toni Kalajainen <toni.kalajainen@vtt.fi>
+ */
+public class SerializerExample3 {
+
+ static class Rectangle2DSerializer extends NonRecursiveSerializer {
+
+ public static final Rectangle2DSerializer INSTANCE = new Rectangle2DSerializer();
+
+ @Override
+ public void serialize(DataOutput out, Object obj)
+ throws IOException
+ {
+ Rectangle2D rect = (Rectangle2D) obj;
+ out.writeDouble(rect.getX());
+ out.writeDouble(rect.getY());
+ out.writeDouble(rect.getWidth());
+ out.writeDouble(rect.getHeight());
+ }
+
+ @Override
+ public Object deserialize(DataInput in)
+ throws IOException {
+ double x = in.readDouble();
+ double y = in.readDouble();
+ double width = in.readDouble();\r
+ double height = in.readDouble();
+ return new Rectangle2D.Double(x, y, width, height);
+ }\r
+ \r
+ @Override\r
+ public void deserializeTo(DataInput in, Object obj)\r
+ throws IOException {\r
+ Rectangle2D.Double r = (Rectangle2D.Double) obj;\r
+ r.x = in.readDouble();\r
+ r.y = in.readDouble();\r
+ r.width = in.readDouble();\r
+ r.height = in.readDouble();\r
+ }
+
+ @Override
+ public Integer getConstantSize() {
+ return 8*4;
+ }
+
+ @Override
+ public int getSize(Object obj) {
+ return 8*4;
+ }
+
+ @Override
+ public void skip(DataInput in) throws IOException {
+ in.skipBytes(8*4);
+ }\r
+ \r
+ @Override\r
+ public int getMinSize() {\r
+ return 8*4;\r
+ }\r
+
+
+ }
+
+ public static void main(String[] args) throws IOException, SerializerConstructionException, SerializationException, BindingException, DatatypeConstructionException, BindingConstructionException
+ {
+
+ Datatype dataType = Datatypes.getDatatype(Rectangle2D.Double.class);
+ System.out.println(dataType);
+ Binding reflectionBinding = Bindings.getBinding(Rectangle2D.Double.class);
+ Binding handWrittenBinding = new BindingExample.Rectangle2DBinding();
+ \r
+ for (int i=0; i<10; i++) {\r
+
+ System.out.println((i+1)+": Lets measure serialization performance... (1,000,000 serialization + deserialization)");
+ Serializer serializer1 = reflectionBinding.serializer();
+ Serializer serializer2 = handWrittenBinding.serializer();
+ Serializer serializer3 = Rectangle2DSerializer.INSTANCE;
+
+ long time1 = getTime(serializer1);
+ long time2 = getTime(serializer2);
+ long time3 = getTime(serializer3);
+
+ System.out.println("Time of Reflection Binding + Automatic Serializer: "+time1+" ms");
+ System.out.println("Time of Hand-Written Binding + Automatic Serializer: "+time2+" ms");
+ System.out.println("Time of Hand-Written Binding + Hand-Written Serializer: "+time3+" ms");\r
+ System.out.println();\r
+ }
+ }
+
+ static long getTime(Serializer serializer)
+ throws IOException, SerializationException, BindingException
+ {
+ Rectangle2D rect = new Rectangle2D.Double(5, 5, 100, 200);
+ TObjectIntHashMap<Object> identities = new TObjectIntHashMap<Object>(0);
+ int size = serializer.getSize(rect, identities);
+ identities.clear();
+ ByteBuffer data = ByteBuffer.allocate( size );
+ ArrayList<Object> identities2 = new ArrayList<Object>();
+ BinaryWriteable out = new ByteBufferWriteable(data);
+ BinaryReadable in = new ByteBufferReadable(data);
+
+ Runtime.getRuntime().gc();
+ long timeAtStart = System.currentTimeMillis();
+ for (int i=0; i<1000000; i++)
+ {
+ serializer.serialize(out, identities, rect);
+ data.rewind();
+ serializer.deserialize(in, identities2);
+ data.rewind();
+ }
+ return System.currentTimeMillis() - timeAtStart;
+
+ }
+
+
+}
+