From dd7ad0574b5ec08eb31e84f4f3476a1ee6c300b6 Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Wed, 3 Jun 2020 08:32:14 -0700 Subject: [PATCH] Fix json serialization of geometries (#12440) --- .../api/Azure.Core.Experimental.netstandard2.0.cs | 3 ++- .../src/Spatial/Geometry.cs | 2 +- .../src/Spatial/GeometryJsonConverter.cs | 6 ++++++ .../Azure.Core.Experimental/tests/SpatialTests.cs | 15 ++++++++++++++- 4 files changed, 23 insertions(+), 3 deletions(-) diff --git a/sdk/core/Azure.Core.Experimental/api/Azure.Core.Experimental.netstandard2.0.cs b/sdk/core/Azure.Core.Experimental/api/Azure.Core.Experimental.netstandard2.0.cs index 0aeaca5e38ca..f44dc29a3e1a 100644 --- a/sdk/core/Azure.Core.Experimental/api/Azure.Core.Experimental.netstandard2.0.cs +++ b/sdk/core/Azure.Core.Experimental/api/Azure.Core.Experimental.netstandard2.0.cs @@ -50,7 +50,7 @@ public CollectionGeometry(System.Collections.Generic.IEnumerable geometries, Azure.Core.Spatial.GeometryProperties properties) : base (default(Azure.Core.Spatial.GeometryProperties)) { } public System.Collections.Generic.IReadOnlyList Geometries { get { throw null; } } } - public partial class Geometry + public abstract partial class Geometry { protected Geometry(Azure.Core.Spatial.GeometryProperties properties) { } public Azure.Core.Spatial.GeometryProperties Properties { get { throw null; } } @@ -74,6 +74,7 @@ protected Geometry(Azure.Core.Spatial.GeometryProperties properties) { } public partial class GeometryJsonConverter : System.Text.Json.Serialization.JsonConverter { public GeometryJsonConverter() { } + public override bool CanConvert(System.Type typeToConvert) { throw null; } public override Azure.Core.Spatial.Geometry Read(ref System.Text.Json.Utf8JsonReader reader, System.Type typeToConvert, System.Text.Json.JsonSerializerOptions options) { throw null; } public override void Write(System.Text.Json.Utf8JsonWriter writer, Azure.Core.Spatial.Geometry value, System.Text.Json.JsonSerializerOptions options) { } } diff --git a/sdk/core/Azure.Core.Experimental/src/Spatial/Geometry.cs b/sdk/core/Azure.Core.Experimental/src/Spatial/Geometry.cs index e326c7f65c32..136b3b80ea87 100644 --- a/sdk/core/Azure.Core.Experimental/src/Spatial/Geometry.cs +++ b/sdk/core/Azure.Core.Experimental/src/Spatial/Geometry.cs @@ -6,7 +6,7 @@ namespace Azure.Core.Spatial /// /// A base type for all spatial types. /// - public class Geometry + public abstract class Geometry { internal static readonly GeometryProperties DefaultProperties = new GeometryProperties(); diff --git a/sdk/core/Azure.Core.Experimental/src/Spatial/GeometryJsonConverter.cs b/sdk/core/Azure.Core.Experimental/src/Spatial/GeometryJsonConverter.cs index a808abf3c91d..4322c46055af 100644 --- a/sdk/core/Azure.Core.Experimental/src/Spatial/GeometryJsonConverter.cs +++ b/sdk/core/Azure.Core.Experimental/src/Spatial/GeometryJsonConverter.cs @@ -25,6 +25,12 @@ public class GeometryJsonConverter : JsonConverter private const string CoordinatesProperty = "coordinates"; private const string BBoxProperty = "bbox"; + /// + public override bool CanConvert(Type typeToConvert) + { + return typeof(Geometry).IsAssignableFrom(typeToConvert); + } + /// public override Geometry Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { diff --git a/sdk/core/Azure.Core.Experimental/tests/SpatialTests.cs b/sdk/core/Azure.Core.Experimental/tests/SpatialTests.cs index 411c4250b0e5..f2a68a0388ee 100644 --- a/sdk/core/Azure.Core.Experimental/tests/SpatialTests.cs +++ b/sdk/core/Azure.Core.Experimental/tests/SpatialTests.cs @@ -247,7 +247,20 @@ private T AssertRoundtrip(string json) where T: Geometry var element2 = JsonDocument.Parse(memoryStreamOutput.ToArray()).RootElement; var geometry2 = GeometryJsonConverter.Read(element2); - return (T)geometry2; + var options = new JsonSerializerOptions() + { + Converters = { new GeometryJsonConverter() } + }; + + // Serialize and deserialize as a base class + var bytes = JsonSerializer.SerializeToUtf8Bytes(geometry2, typeof(Geometry), options); + var geometry3 = JsonSerializer.Deserialize(bytes, options); + + // Serialize and deserialize as a concrete class + var bytes2 = JsonSerializer.SerializeToUtf8Bytes(geometry3, options); + var geometry4 = JsonSerializer.Deserialize(bytes2, options); + + return geometry4; } } } \ No newline at end of file