You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sedona.apache.org by ma...@apache.org on 2021/03/29 20:47:46 UTC

[incubator-sedona] branch Sedona-17_Shape&WKBSerDe created (now 5f8a441)

This is an automated email from the ASF dual-hosted git repository.

malka pushed a change to branch Sedona-17_Shape&WKBSerDe
in repository https://gitbox.apache.org/repos/asf/incubator-sedona.git.


      at 5f8a441  Added WKBGeometrySerde to handle special geometry types that the Shape serde not handled well

This branch includes the following new commits:

     new 35fe9ec  Moved SpatialIndexSerde to serde dir->SpatialIndex Removed unused GeometrySerde object from SpatialIndexSerde (eliminate the requirement to handle WKB and Shape GeometrySerde)
     new bcf45a0  Refactor actual registration to SedonaKryoRegistratorHelper Create SedonaWKBKryoRegistrator for WKB support
     new 5f8a441  Added WKBGeometrySerde to handle special geometry types that the Shape serde not handled well

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


[incubator-sedona] 02/03: Refactor actual registration to SedonaKryoRegistratorHelper Create SedonaWKBKryoRegistrator for WKB support

Posted by ma...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

malka pushed a commit to branch Sedona-17_Shape&WKBSerDe
in repository https://gitbox.apache.org/repos/asf/incubator-sedona.git

commit bcf45a05ca559f0c5df46e2068ff6f1e398ed5fa
Author: Netanel Malka <ne...@gmail.com>
AuthorDate: Mon Mar 29 23:22:08 2021 +0300

    Refactor actual registration to SedonaKryoRegistratorHelper
    Create SedonaWKBKryoRegistrator for WKB support
---
 .../sedona/core/serde/SedonaKryoRegistrator.java   | 31 +++++----------
 ...rator.java => SedonaKryoRegistratorHelper.java} | 43 +++++++++++----------
 .../core/serde/SedonaWKBKryoRegistrator.java       | 45 ++++++++++++++++++++++
 3 files changed, 76 insertions(+), 43 deletions(-)

diff --git a/core/src/main/java/org/apache/sedona/core/serde/SedonaKryoRegistrator.java b/core/src/main/java/org/apache/sedona/core/serde/SedonaKryoRegistrator.java
index 57894ea..5843b7d 100644
--- a/core/src/main/java/org/apache/sedona/core/serde/SedonaKryoRegistrator.java
+++ b/core/src/main/java/org/apache/sedona/core/serde/SedonaKryoRegistrator.java
@@ -23,7 +23,7 @@ import com.esotericsoftware.kryo.Kryo;
 import org.apache.log4j.Logger;
 import org.apache.sedona.core.geometryObjects.Circle;
 import org.apache.sedona.core.geometryObjects.GeometrySerde;
-import org.apache.sedona.core.geometryObjects.SpatialIndexSerde;
+import org.apache.sedona.core.serde.spatialindex.SpatialIndexSerde;
 import org.apache.spark.serializer.KryoRegistrator;
 import org.locationtech.jts.geom.Envelope;
 import org.locationtech.jts.geom.GeometryCollection;
@@ -36,31 +36,18 @@ import org.locationtech.jts.geom.Polygon;
 import org.locationtech.jts.index.quadtree.Quadtree;
 import org.locationtech.jts.index.strtree.STRtree;
 
+/**
+ * Register Kryo classes using the Geometry Serde(using the ShapeFile serialization)
+ * and SpatialIndexSerde for index objects
+ */
 public class SedonaKryoRegistrator
-        implements KryoRegistrator
-{
-
-    final static Logger log = Logger.getLogger(SedonaKryoRegistrator.class);
+        implements KryoRegistrator {
 
     @Override
-    public void registerClasses(Kryo kryo)
-    {
+    public void registerClasses(Kryo kryo) {
         GeometrySerde serializer = new GeometrySerde();
-        SpatialIndexSerde indexSerializer = new SpatialIndexSerde(serializer);
-
-        log.info("Registering custom serializers for geometry types");
+        SpatialIndexSerde indexSerializer = new SpatialIndexSerde();
 
-        kryo.register(Point.class, serializer);
-        kryo.register(LineString.class, serializer);
-        kryo.register(Polygon.class, serializer);
-        kryo.register(MultiPoint.class, serializer);
-        kryo.register(MultiLineString.class, serializer);
-        kryo.register(MultiPolygon.class, serializer);
-        kryo.register(GeometryCollection.class, serializer);
-        kryo.register(Circle.class, serializer);
-        kryo.register(Envelope.class, serializer);
-        // TODO: Replace the default serializer with default spatial index serializer
-        kryo.register(Quadtree.class, indexSerializer);
-        kryo.register(STRtree.class, indexSerializer);
+        SedonaKryoRegistratorHelper.registerClasses(kryo, serializer, indexSerializer);
     }
 }
diff --git a/core/src/main/java/org/apache/sedona/core/serde/SedonaKryoRegistrator.java b/core/src/main/java/org/apache/sedona/core/serde/SedonaKryoRegistratorHelper.java
similarity index 65%
copy from core/src/main/java/org/apache/sedona/core/serde/SedonaKryoRegistrator.java
copy to core/src/main/java/org/apache/sedona/core/serde/SedonaKryoRegistratorHelper.java
index 57894ea..c32a3dc 100644
--- a/core/src/main/java/org/apache/sedona/core/serde/SedonaKryoRegistrator.java
+++ b/core/src/main/java/org/apache/sedona/core/serde/SedonaKryoRegistratorHelper.java
@@ -20,36 +20,36 @@
 package org.apache.sedona.core.serde;
 
 import com.esotericsoftware.kryo.Kryo;
+import com.esotericsoftware.kryo.Serializer;
 import org.apache.log4j.Logger;
 import org.apache.sedona.core.geometryObjects.Circle;
 import org.apache.sedona.core.geometryObjects.GeometrySerde;
-import org.apache.sedona.core.geometryObjects.SpatialIndexSerde;
-import org.apache.spark.serializer.KryoRegistrator;
-import org.locationtech.jts.geom.Envelope;
-import org.locationtech.jts.geom.GeometryCollection;
-import org.locationtech.jts.geom.LineString;
-import org.locationtech.jts.geom.MultiLineString;
-import org.locationtech.jts.geom.MultiPoint;
-import org.locationtech.jts.geom.MultiPolygon;
-import org.locationtech.jts.geom.Point;
-import org.locationtech.jts.geom.Polygon;
+import org.apache.sedona.core.geometryObjects.WKBGeometrySerde;
+import org.apache.sedona.core.serde.spatialindex.SpatialIndexSerde;
+import org.locationtech.jts.geom.*;
 import org.locationtech.jts.index.quadtree.Quadtree;
 import org.locationtech.jts.index.strtree.STRtree;
 
-public class SedonaKryoRegistrator
-        implements KryoRegistrator
-{
-
-    final static Logger log = Logger.getLogger(SedonaKryoRegistrator.class);
+/**
+ * Register Kryo classes by the type of geometry serde mechanism
+ */
+public class SedonaKryoRegistratorHelper {
 
-    @Override
-    public void registerClasses(Kryo kryo)
-    {
-        GeometrySerde serializer = new GeometrySerde();
-        SpatialIndexSerde indexSerializer = new SpatialIndexSerde(serializer);
+    final static Logger log = Logger.getLogger(SedonaWKBKryoRegistrator.class);
 
+    public static void registerClasses(Kryo kryo, Serializer geometrySerdeType, SpatialIndexSerde indexSerializer) {
         log.info("Registering custom serializers for geometry types");
 
+        Serializer serializer;
+        if (geometrySerdeType instanceof WKBGeometrySerde) {
+            serializer = new WKBGeometrySerde();
+        } else if (geometrySerdeType instanceof GeometrySerde) {
+            serializer = new GeometrySerde();
+        } else
+            throw new UnsupportedOperationException(String.format("Geometry Serde: %s is not supported",
+                    geometrySerdeType.getClass().getName())
+            );
+
         kryo.register(Point.class, serializer);
         kryo.register(LineString.class, serializer);
         kryo.register(Polygon.class, serializer);
@@ -59,8 +59,9 @@ public class SedonaKryoRegistrator
         kryo.register(GeometryCollection.class, serializer);
         kryo.register(Circle.class, serializer);
         kryo.register(Envelope.class, serializer);
-        // TODO: Replace the default serializer with default spatial index serializer
+
         kryo.register(Quadtree.class, indexSerializer);
         kryo.register(STRtree.class, indexSerializer);
     }
+
 }
diff --git a/core/src/main/java/org/apache/sedona/core/serde/SedonaWKBKryoRegistrator.java b/core/src/main/java/org/apache/sedona/core/serde/SedonaWKBKryoRegistrator.java
new file mode 100644
index 0000000..939c262
--- /dev/null
+++ b/core/src/main/java/org/apache/sedona/core/serde/SedonaWKBKryoRegistrator.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.sedona.core.serde;
+
+import com.esotericsoftware.kryo.Kryo;
+import org.apache.log4j.Logger;
+import org.apache.sedona.core.geometryObjects.Circle;
+import org.apache.sedona.core.serde.spatialindex.SpatialIndexSerde;
+import org.apache.sedona.core.geometryObjects.WKBGeometrySerde;
+import org.apache.spark.serializer.KryoRegistrator;
+import org.locationtech.jts.geom.*;
+import org.locationtech.jts.index.quadtree.Quadtree;
+import org.locationtech.jts.index.strtree.STRtree;
+
+/**
+ * Register Kryo classes using the WKB Geometry Serde and SpatialIndexSerde for index objects
+ */
+public class SedonaWKBKryoRegistrator
+        implements KryoRegistrator {
+
+    @Override
+    public void registerClasses(Kryo kryo) {
+        WKBGeometrySerde serializer = new WKBGeometrySerde();
+        SpatialIndexSerde indexSerializer = new SpatialIndexSerde();
+
+        SedonaKryoRegistratorHelper.registerClasses(kryo, serializer, indexSerializer);
+    }
+}

[incubator-sedona] 01/03: Moved SpatialIndexSerde to serde dir->SpatialIndex Removed unused GeometrySerde object from SpatialIndexSerde (eliminate the requirement to handle WKB and Shape GeometrySerde)

Posted by ma...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

malka pushed a commit to branch Sedona-17_Shape&WKBSerDe
in repository https://gitbox.apache.org/repos/asf/incubator-sedona.git

commit 35fe9eca0ac6a2a0ffbc13d981337b9903db5bf2
Author: Netanel Malka <ne...@gmail.com>
AuthorDate: Mon Mar 29 21:16:14 2021 +0300

    Moved SpatialIndexSerde to serde dir->SpatialIndex
    Removed unused GeometrySerde object from SpatialIndexSerde (eliminate the requirement to handle WKB and Shape GeometrySerde)
---
 .../spatialindex}/SpatialIndexSerde.java                | 17 ++++++-----------
 .../core/geometryObjects/SpatialIndexSerdeTest.java     |  3 ++-
 2 files changed, 8 insertions(+), 12 deletions(-)

diff --git a/core/src/main/java/org/apache/sedona/core/geometryObjects/SpatialIndexSerde.java b/core/src/main/java/org/apache/sedona/core/serde/spatialindex/SpatialIndexSerde.java
similarity index 92%
rename from core/src/main/java/org/apache/sedona/core/geometryObjects/SpatialIndexSerde.java
rename to core/src/main/java/org/apache/sedona/core/serde/spatialindex/SpatialIndexSerde.java
index a8e5cbe..084c892 100644
--- a/core/src/main/java/org/apache/sedona/core/geometryObjects/SpatialIndexSerde.java
+++ b/core/src/main/java/org/apache/sedona/core/serde/spatialindex/SpatialIndexSerde.java
@@ -17,17 +17,21 @@
  * under the License.
  */
 
-package org.apache.sedona.core.geometryObjects;
+package org.apache.sedona.core.serde.spatialindex;
 
 import com.esotericsoftware.kryo.Kryo;
 import com.esotericsoftware.kryo.Serializer;
 import com.esotericsoftware.kryo.io.Input;
 import com.esotericsoftware.kryo.io.Output;
 import org.apache.log4j.Logger;
+import org.apache.sedona.core.geometryObjects.GeometrySerde;
+import org.apache.sedona.core.geometryObjects.WKBGeometrySerde;
 import org.locationtech.jts.index.quadtree.IndexSerde;
 import org.locationtech.jts.index.quadtree.Quadtree;
 import org.locationtech.jts.index.strtree.STRtree;
 
+import java.util.Objects;
+
 /**
  * Provides methods to efficiently serialize and deserialize spatialIndex types.
  * <p>
@@ -41,18 +45,9 @@ public class SpatialIndexSerde
 
     private static final Logger log = Logger.getLogger(SpatialIndexSerde.class);
 
-    private final GeometrySerde geometrySerde;
-
     public SpatialIndexSerde()
     {
         super();
-        geometrySerde = new GeometrySerde();
-    }
-
-    public SpatialIndexSerde(GeometrySerde geometrySerde)
-    {
-        super();
-        this.geometrySerde = geometrySerde;
     }
 
     @Override
@@ -83,7 +78,7 @@ public class SpatialIndexSerde
     {
         byte typeID = input.readByte();
         Type indexType = Type.fromId(typeID);
-        switch (indexType) {
+        switch (Objects.requireNonNull(indexType, "indexType cannot be null")) {
             case QUADTREE: {
                 IndexSerde indexSerde = new IndexSerde();
                 return indexSerde.read(kryo, input);
diff --git a/core/src/test/java/org/apache/sedona/core/geometryObjects/SpatialIndexSerdeTest.java b/core/src/test/java/org/apache/sedona/core/geometryObjects/SpatialIndexSerdeTest.java
index b44ee21..99bb46c 100644
--- a/core/src/test/java/org/apache/sedona/core/geometryObjects/SpatialIndexSerdeTest.java
+++ b/core/src/test/java/org/apache/sedona/core/geometryObjects/SpatialIndexSerdeTest.java
@@ -22,6 +22,7 @@ package org.apache.sedona.core.geometryObjects;
 import com.esotericsoftware.kryo.Kryo;
 import com.esotericsoftware.kryo.io.Input;
 import com.esotericsoftware.kryo.io.Output;
+import org.apache.sedona.core.serde.spatialindex.SpatialIndexSerde;
 import org.junit.Test;
 import org.locationtech.jts.geom.Coordinate;
 import org.locationtech.jts.geom.Envelope;
@@ -69,7 +70,7 @@ public class SpatialIndexSerdeTest
         compareSize(Quadtree.class);
         compareSize(STRtree.class);
 
-//        // workbench of compare time
+        // workbench of compare time
         compareTime(Quadtree.class);
         compareTime(STRtree.class);
     }

[incubator-sedona] 03/03: Added WKBGeometrySerde to handle special geometry types that the Shape serde not handled well

Posted by ma...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

malka pushed a commit to branch Sedona-17_Shape&WKBSerDe
in repository https://gitbox.apache.org/repos/asf/incubator-sedona.git

commit 5f8a441c26256c5f30710037bb1bbf59bc2d6f53
Author: Netanel Malka <ne...@gmail.com>
AuthorDate: Mon Mar 29 23:47:23 2021 +0300

    Added WKBGeometrySerde to handle special geometry types that the Shape serde not handled well
---
 .../sedona/core/serde/SedonaKryoRegistrator.java   | 16 +-----
 .../core/serde/SedonaKryoRegistratorHelper.java    |  8 +--
 .../core/serde/SedonaWKBKryoRegistrator.java       |  7 +--
 .../WKB/WKBGeometrySerde.java}                     | 59 +++++++++++++++-------
 .../shape/ShapeGeometrySerde.java}                 |  8 +--
 .../core/serde/spatialindex/SpatialIndexSerde.java |  2 -
 .../jts/index/quadtree/IndexSerde.java             |  6 +--
 .../locationtech/jts/index/strtree/IndexSerde.java |  6 +--
 ...ySerdeTest.java => ShapeGeometrySerdeTest.java} |  6 +--
 9 files changed, 61 insertions(+), 57 deletions(-)

diff --git a/core/src/main/java/org/apache/sedona/core/serde/SedonaKryoRegistrator.java b/core/src/main/java/org/apache/sedona/core/serde/SedonaKryoRegistrator.java
index 5843b7d..dfb5962 100644
--- a/core/src/main/java/org/apache/sedona/core/serde/SedonaKryoRegistrator.java
+++ b/core/src/main/java/org/apache/sedona/core/serde/SedonaKryoRegistrator.java
@@ -20,21 +20,9 @@
 package org.apache.sedona.core.serde;
 
 import com.esotericsoftware.kryo.Kryo;
-import org.apache.log4j.Logger;
-import org.apache.sedona.core.geometryObjects.Circle;
-import org.apache.sedona.core.geometryObjects.GeometrySerde;
+import org.apache.sedona.core.serde.shape.ShapeGeometrySerde;
 import org.apache.sedona.core.serde.spatialindex.SpatialIndexSerde;
 import org.apache.spark.serializer.KryoRegistrator;
-import org.locationtech.jts.geom.Envelope;
-import org.locationtech.jts.geom.GeometryCollection;
-import org.locationtech.jts.geom.LineString;
-import org.locationtech.jts.geom.MultiLineString;
-import org.locationtech.jts.geom.MultiPoint;
-import org.locationtech.jts.geom.MultiPolygon;
-import org.locationtech.jts.geom.Point;
-import org.locationtech.jts.geom.Polygon;
-import org.locationtech.jts.index.quadtree.Quadtree;
-import org.locationtech.jts.index.strtree.STRtree;
 
 /**
  * Register Kryo classes using the Geometry Serde(using the ShapeFile serialization)
@@ -45,7 +33,7 @@ public class SedonaKryoRegistrator
 
     @Override
     public void registerClasses(Kryo kryo) {
-        GeometrySerde serializer = new GeometrySerde();
+        ShapeGeometrySerde serializer = new ShapeGeometrySerde();
         SpatialIndexSerde indexSerializer = new SpatialIndexSerde();
 
         SedonaKryoRegistratorHelper.registerClasses(kryo, serializer, indexSerializer);
diff --git a/core/src/main/java/org/apache/sedona/core/serde/SedonaKryoRegistratorHelper.java b/core/src/main/java/org/apache/sedona/core/serde/SedonaKryoRegistratorHelper.java
index c32a3dc..072d344 100644
--- a/core/src/main/java/org/apache/sedona/core/serde/SedonaKryoRegistratorHelper.java
+++ b/core/src/main/java/org/apache/sedona/core/serde/SedonaKryoRegistratorHelper.java
@@ -23,8 +23,8 @@ import com.esotericsoftware.kryo.Kryo;
 import com.esotericsoftware.kryo.Serializer;
 import org.apache.log4j.Logger;
 import org.apache.sedona.core.geometryObjects.Circle;
-import org.apache.sedona.core.geometryObjects.GeometrySerde;
-import org.apache.sedona.core.geometryObjects.WKBGeometrySerde;
+import org.apache.sedona.core.serde.shape.ShapeGeometrySerde;
+import org.apache.sedona.core.serde.WKB.WKBGeometrySerde;
 import org.apache.sedona.core.serde.spatialindex.SpatialIndexSerde;
 import org.locationtech.jts.geom.*;
 import org.locationtech.jts.index.quadtree.Quadtree;
@@ -43,8 +43,8 @@ public class SedonaKryoRegistratorHelper {
         Serializer serializer;
         if (geometrySerdeType instanceof WKBGeometrySerde) {
             serializer = new WKBGeometrySerde();
-        } else if (geometrySerdeType instanceof GeometrySerde) {
-            serializer = new GeometrySerde();
+        } else if (geometrySerdeType instanceof ShapeGeometrySerde) {
+            serializer = new ShapeGeometrySerde();
         } else
             throw new UnsupportedOperationException(String.format("Geometry Serde: %s is not supported",
                     geometrySerdeType.getClass().getName())
diff --git a/core/src/main/java/org/apache/sedona/core/serde/SedonaWKBKryoRegistrator.java b/core/src/main/java/org/apache/sedona/core/serde/SedonaWKBKryoRegistrator.java
index 939c262..adc5047 100644
--- a/core/src/main/java/org/apache/sedona/core/serde/SedonaWKBKryoRegistrator.java
+++ b/core/src/main/java/org/apache/sedona/core/serde/SedonaWKBKryoRegistrator.java
@@ -20,14 +20,9 @@
 package org.apache.sedona.core.serde;
 
 import com.esotericsoftware.kryo.Kryo;
-import org.apache.log4j.Logger;
-import org.apache.sedona.core.geometryObjects.Circle;
 import org.apache.sedona.core.serde.spatialindex.SpatialIndexSerde;
-import org.apache.sedona.core.geometryObjects.WKBGeometrySerde;
+import org.apache.sedona.core.serde.WKB.WKBGeometrySerde;
 import org.apache.spark.serializer.KryoRegistrator;
-import org.locationtech.jts.geom.*;
-import org.locationtech.jts.index.quadtree.Quadtree;
-import org.locationtech.jts.index.strtree.STRtree;
 
 /**
  * Register Kryo classes using the WKB Geometry Serde and SpatialIndexSerde for index objects
diff --git a/core/src/main/java/org/apache/sedona/core/geometryObjects/GeometrySerde.java b/core/src/main/java/org/apache/sedona/core/serde/WKB/WKBGeometrySerde.java
similarity index 80%
copy from core/src/main/java/org/apache/sedona/core/geometryObjects/GeometrySerde.java
copy to core/src/main/java/org/apache/sedona/core/serde/WKB/WKBGeometrySerde.java
index 213e8f2..0543388 100755
--- a/core/src/main/java/org/apache/sedona/core/geometryObjects/GeometrySerde.java
+++ b/core/src/main/java/org/apache/sedona/core/serde/WKB/WKBGeometrySerde.java
@@ -17,7 +17,9 @@
  * under the License.
  */
 
-package org.apache.sedona.core.geometryObjects;
+package org.apache.sedona.core.serde.WKB;
+
+import java.util.Objects;
 
 import com.esotericsoftware.kryo.Kryo;
 import com.esotericsoftware.kryo.Registration;
@@ -25,7 +27,8 @@ import com.esotericsoftware.kryo.Serializer;
 import com.esotericsoftware.kryo.io.Input;
 import com.esotericsoftware.kryo.io.Output;
 import org.apache.log4j.Logger;
-import org.apache.sedona.core.formatMapper.shapefileParser.parseUtils.shp.ShapeSerde;
+import org.apache.sedona.core.geometryObjects.Circle;
+import org.apache.sedona.core.serde.shape.ShapeGeometrySerde;
 import org.locationtech.jts.geom.Envelope;
 import org.locationtech.jts.geom.Geometry;
 import org.locationtech.jts.geom.GeometryCollection;
@@ -36,21 +39,26 @@ import org.locationtech.jts.geom.MultiPoint;
 import org.locationtech.jts.geom.MultiPolygon;
 import org.locationtech.jts.geom.Point;
 import org.locationtech.jts.geom.Polygon;
+import org.locationtech.jts.io.ParseException;
+import org.locationtech.jts.io.WKBReader;
+import org.locationtech.jts.io.WKBWriter;
 
 /**
- * Provides methods to efficiently serialize and deserialize geometry types.
+ * Provides methods to efficiently serialize and deserialize geometry types using the WKB format
  * <p>
- * Supports Point, LineString, Polygon, MultiPoint, MultiLineString, MultiPolygon,
- * GeometryCollection, Circle and Envelope types.
+ * Supports Point, LineString, Polygon, MultiPoint, MultiLineString,
+ * MultiPolygon, GeometryCollection, Circle and Envelope types.
  * <p>
- * First byte contains {@link Type#id}. Then go type-specific bytes, followed
- * by user-data attached to the geometry.
+ * First byte contains {@link Type#id}. Then go type-specific bytes, followed by
+ * user-data attached to the geometry.
  */
-public class GeometrySerde
+public class WKBGeometrySerde
         extends Serializer
 {
 
-    private static final Logger log = Logger.getLogger(GeometrySerde.class);
+    // TODO - Add tests for WKB serialization
+    // TODO - Consolidate GeometrySerde to eliminate code repetition
+    private static final Logger log = Logger.getLogger(ShapeGeometrySerde.class);
     private static final GeometryFactory geometryFactory = new GeometryFactory();
 
     @Override
@@ -99,13 +107,16 @@ public class GeometrySerde
 
     private void writeGeometry(Kryo kryo, Output out, Geometry geometry)
     {
-        byte[] data = ShapeSerde.serialize(geometry);
+        WKBWriter writer = new WKBWriter(2, 2, true);
+        byte[] data = writer.write(geometry);
+
+        // write geometry length size to read bytes until userData
+        out.writeInt(data.length, true);
         out.write(data, 0, data.length);
         writeUserData(kryo, out, geometry);
     }
 
-    private void writeUserData(Kryo kryo, Output out, Geometry geometry)
-    {
+    private void writeUserData(Kryo kryo, Output out, Geometry geometry) {
         out.writeBoolean(geometry.getUserData() != null);
         if (geometry.getUserData() != null) {
             kryo.writeClass(out, geometry.getUserData().getClass());
@@ -118,7 +129,7 @@ public class GeometrySerde
     {
         byte typeId = input.readByte();
         Type geometryType = Type.fromId(typeId);
-        switch (geometryType) {
+        switch (Objects.requireNonNull(geometryType)) {
             case SHAPE:
                 return readGeometry(kryo, input);
             case CIRCLE: {
@@ -153,8 +164,7 @@ public class GeometrySerde
         }
     }
 
-    private Object readUserData(Kryo kryo, Input input)
-    {
+    private Object readUserData(Kryo kryo, Input input) {
         Object userData = null;
         if (input.readBoolean()) {
             Registration clazz = kryo.readClass(input);
@@ -163,10 +173,21 @@ public class GeometrySerde
         return userData;
     }
 
-    private Geometry readGeometry(Kryo kryo, Input input)
-    {
-        Geometry geometry = ShapeSerde.deserialize(input, geometryFactory);
-        geometry.setUserData(readUserData(kryo, input));
+    private Geometry readGeometry(Kryo kryo, Input input) {
+        WKBReader reader = new WKBReader();
+        Geometry geometry;
+
+        int geometryBytesLength = input.readInt(true);
+        byte[] bytes = input.readBytes(geometryBytesLength);
+
+        try {
+            geometry = reader.read(bytes);
+            geometry.setUserData(readUserData(kryo, input));
+        } catch (ParseException e) {
+            log.error("Cannot parse geometry bytes", e);
+            return null;
+        }
+
         return geometry;
     }
 
diff --git a/core/src/main/java/org/apache/sedona/core/geometryObjects/GeometrySerde.java b/core/src/main/java/org/apache/sedona/core/serde/shape/ShapeGeometrySerde.java
similarity index 96%
rename from core/src/main/java/org/apache/sedona/core/geometryObjects/GeometrySerde.java
rename to core/src/main/java/org/apache/sedona/core/serde/shape/ShapeGeometrySerde.java
index 213e8f2..c5551ed 100755
--- a/core/src/main/java/org/apache/sedona/core/geometryObjects/GeometrySerde.java
+++ b/core/src/main/java/org/apache/sedona/core/serde/shape/ShapeGeometrySerde.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.sedona.core.geometryObjects;
+package org.apache.sedona.core.serde.shape;
 
 import com.esotericsoftware.kryo.Kryo;
 import com.esotericsoftware.kryo.Registration;
@@ -26,6 +26,7 @@ import com.esotericsoftware.kryo.io.Input;
 import com.esotericsoftware.kryo.io.Output;
 import org.apache.log4j.Logger;
 import org.apache.sedona.core.formatMapper.shapefileParser.parseUtils.shp.ShapeSerde;
+import org.apache.sedona.core.geometryObjects.Circle;
 import org.locationtech.jts.geom.Envelope;
 import org.locationtech.jts.geom.Geometry;
 import org.locationtech.jts.geom.GeometryCollection;
@@ -46,11 +47,11 @@ import org.locationtech.jts.geom.Polygon;
  * First byte contains {@link Type#id}. Then go type-specific bytes, followed
  * by user-data attached to the geometry.
  */
-public class GeometrySerde
+public class ShapeGeometrySerde
         extends Serializer
 {
 
-    private static final Logger log = Logger.getLogger(GeometrySerde.class);
+    private static final Logger log = Logger.getLogger(ShapeGeometrySerde.class);
     private static final GeometryFactory geometryFactory = new GeometryFactory();
 
     @Override
@@ -165,6 +166,7 @@ public class GeometrySerde
 
     private Geometry readGeometry(Kryo kryo, Input input)
     {
+        //TODO Find the kryo registrator class and create one file of that
         Geometry geometry = ShapeSerde.deserialize(input, geometryFactory);
         geometry.setUserData(readUserData(kryo, input));
         return geometry;
diff --git a/core/src/main/java/org/apache/sedona/core/serde/spatialindex/SpatialIndexSerde.java b/core/src/main/java/org/apache/sedona/core/serde/spatialindex/SpatialIndexSerde.java
index 084c892..72ca10e 100644
--- a/core/src/main/java/org/apache/sedona/core/serde/spatialindex/SpatialIndexSerde.java
+++ b/core/src/main/java/org/apache/sedona/core/serde/spatialindex/SpatialIndexSerde.java
@@ -24,8 +24,6 @@ import com.esotericsoftware.kryo.Serializer;
 import com.esotericsoftware.kryo.io.Input;
 import com.esotericsoftware.kryo.io.Output;
 import org.apache.log4j.Logger;
-import org.apache.sedona.core.geometryObjects.GeometrySerde;
-import org.apache.sedona.core.geometryObjects.WKBGeometrySerde;
 import org.locationtech.jts.index.quadtree.IndexSerde;
 import org.locationtech.jts.index.quadtree.Quadtree;
 import org.locationtech.jts.index.strtree.STRtree;
diff --git a/core/src/main/java/org/locationtech/jts/index/quadtree/IndexSerde.java b/core/src/main/java/org/locationtech/jts/index/quadtree/IndexSerde.java
index 5dd6556..6d796af 100644
--- a/core/src/main/java/org/locationtech/jts/index/quadtree/IndexSerde.java
+++ b/core/src/main/java/org/locationtech/jts/index/quadtree/IndexSerde.java
@@ -16,7 +16,7 @@ package org.locationtech.jts.index.quadtree;
 import com.esotericsoftware.kryo.Kryo;
 import com.esotericsoftware.kryo.io.Input;
 import com.esotericsoftware.kryo.io.Output;
-import org.apache.sedona.core.geometryObjects.GeometrySerde;
+import org.apache.sedona.core.serde.shape.ShapeGeometrySerde;
 import org.locationtech.jts.geom.Envelope;
 import org.locationtech.jts.geom.Geometry;
 
@@ -29,9 +29,9 @@ import java.util.List;
  */
 public class IndexSerde
 {
-    GeometrySerde geometrySerde;
+    ShapeGeometrySerde geometrySerde;
     public IndexSerde() {
-        geometrySerde = new GeometrySerde();
+        geometrySerde = new ShapeGeometrySerde();
     }
 
     public Object read(Kryo kryo, Input input){
diff --git a/core/src/main/java/org/locationtech/jts/index/strtree/IndexSerde.java b/core/src/main/java/org/locationtech/jts/index/strtree/IndexSerde.java
index bf3d308..6904b98 100644
--- a/core/src/main/java/org/locationtech/jts/index/strtree/IndexSerde.java
+++ b/core/src/main/java/org/locationtech/jts/index/strtree/IndexSerde.java
@@ -16,7 +16,7 @@ package org.locationtech.jts.index.strtree;
 import com.esotericsoftware.kryo.Kryo;
 import com.esotericsoftware.kryo.io.Input;
 import com.esotericsoftware.kryo.io.Output;
-import org.apache.sedona.core.geometryObjects.GeometrySerde;
+import org.apache.sedona.core.serde.shape.ShapeGeometrySerde;
 import org.locationtech.jts.geom.Envelope;
 import org.locationtech.jts.geom.Geometry;
 
@@ -29,9 +29,9 @@ import java.util.List;
  */
 public class IndexSerde
 {
-    GeometrySerde geometrySerde;
+    ShapeGeometrySerde geometrySerde;
     public IndexSerde() {
-        geometrySerde = new GeometrySerde();
+        geometrySerde = new ShapeGeometrySerde();
     }
 
     public Object read(Kryo kryo, Input input){
diff --git a/core/src/test/java/org/apache/sedona/core/formatMapper/shapefileParser/shapes/GeometrySerdeTest.java b/core/src/test/java/org/apache/sedona/core/formatMapper/shapefileParser/shapes/ShapeGeometrySerdeTest.java
similarity index 95%
rename from core/src/test/java/org/apache/sedona/core/formatMapper/shapefileParser/shapes/GeometrySerdeTest.java
rename to core/src/test/java/org/apache/sedona/core/formatMapper/shapefileParser/shapes/ShapeGeometrySerdeTest.java
index 3bb9af4..ab0e0d4 100644
--- a/core/src/test/java/org/apache/sedona/core/formatMapper/shapefileParser/shapes/GeometrySerdeTest.java
+++ b/core/src/test/java/org/apache/sedona/core/formatMapper/shapefileParser/shapes/ShapeGeometrySerdeTest.java
@@ -23,7 +23,7 @@ import com.esotericsoftware.kryo.Kryo;
 import com.esotericsoftware.kryo.io.Input;
 import com.esotericsoftware.kryo.io.Output;
 import org.apache.sedona.core.geometryObjects.Circle;
-import org.apache.sedona.core.geometryObjects.GeometrySerde;
+import org.apache.sedona.core.serde.shape.ShapeGeometrySerde;
 import org.apache.sedona.core.utils.GeomUtils;
 import org.junit.Test;
 import org.locationtech.jts.geom.Geometry;
@@ -35,7 +35,7 @@ import java.io.ByteArrayOutputStream;
 
 import static org.junit.Assert.assertTrue;
 
-public class GeometrySerdeTest
+public class ShapeGeometrySerdeTest
 {
     private final Kryo kryo = new Kryo();
     private final WKTReader wktReader = new WKTReader();
@@ -86,7 +86,7 @@ public class GeometrySerdeTest
 
     private byte[] serialize(Geometry input)
     {
-        kryo.register(input.getClass(), new GeometrySerde());
+        kryo.register(input.getClass(), new ShapeGeometrySerde());
 
         ByteArrayOutputStream bos = new ByteArrayOutputStream();
         Output output = new Output(bos);