Json.NET(シリアル化用)とGeoAPI.NET(ジオメトリ定義用)を使用して、オブジェクトをGeoJSONにシリアル化するC#ライブラリを作成しようとしています。JSON.NETを使用してカスタムGeoJsonシリアライザを作成する方法に関する提案?
私はシリアライゼーションの実装に2つの異なるアプローチがあると考えていますが、どちらが最善のアプローチであるかはっきりしていません。彼らは以下のとおりです。
アプローチ1 - カスタム
最初のアプローチは、シリアライズを変更するには、任意のクラスに適用することができ、いくつかのカスタム属性を作成する必要が属性。例えば、クラスがそのような内装が施されることがあります。このアプローチの利点は、任意のビジネス・オブジェクトがAに変えることができることである
JsonNetResult jsonNetResult = new JsonNetResult();
jsonNetResult.Formatting = Formatting.Indented;
jsonNetResult.Data = building;
return jsonNetResult;
:
[GeoJsonFeature]
public class Building
{
[GeoJsonId]
public Guid Id { get; set; }
[GeoJsonProperty]
public string Name { get; set; }
[GeoJsonProperty]
public int Floorcount { get; set; }
[GeoJsonGeometry]
public GeoAPI.Geometries.IGeometry Geometry { get; set; }
}
がオブジェクトをシリアル化することは、その後のように簡単になりますGeoJSONオブジェクトには、必要なプロパティ(たとえば、ジオメトリ)があると仮定します。欠点は、シリアル化をサポートするためにカスタム属性をいくつか作成する必要があることです。さらに、これはビジネスオブジェクトを「泥だらけ」させるという影響を与えます。
最後に、私はこのアプローチがJSON.NETでも可能かどうかはまだ判断していませんが、そうであるようです。
アプローチ2 - カスタムJsonConverter
第2のアプローチは、様々なタイプのカスタム変換を作成することを含みます。たとえば、GeoJsonConverterがあるとします。指定されたタイプのオブジェクト、たとえばFeatureを渡すと、GeoJSONオブジェクトが作成されます。私はそのようにようにGeoJSONにシリアライズすることができるだろう
public class GeoJsonFeatureConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer)
{
// serializing code here
}
public override void ReadJson(JsonReader reader, Type objectType, JsonSerializer serializer)
{
// deserializing code here
}
public override bool CanConvert(Type objectType)
{
return typeof(Feature).IsAssignableFrom(objectType);
}
}
:これは次のようになります
JsonNetResult jsonNetResult = new JsonNetResult();
jsonNetResult.Formatting = Formatting.Indented;
jsonNetResult.SerializerSettings.Converters.Add(new GeoJsonFeatureConverter());
jsonNetResult.Data = building;
ここでの利点は、これが作成しやすいようだということです。私はこのアプローチが非常に簡単なプロトタイプを介して可能であることを証明しました。また、NetTopologySuiteにリンクすると、Feature
クラスが既に定義されています。
私のビジネスオブジェクトは、シリアル化される前にFeature
にマップする必要があります。これは、層の間の自然な分離を可能にするので、これは利点と考えられる。後者の場合、NetTopologySuiteとGeoAPIとの密接な結合が確かにあります。私はそれで大丈夫だと思う。
私は、GeoJson.NETのようないくつかのGeoJsonシリアライザを利用していますが、Json.NET APIとの一貫性のあるアプローチが欲しいです。
1つの方法が他の方法より優先される明確な理由がありますか?おそらく私が気づいていない別のアプローチがありますか?
参考までに、私は第2のアプローチに傾いています。それは実装が簡単で、全体としてはよりクリーンになると思われます。私はドメインオブジェクトとそれが作成するGeoJsonオブジェクトの間の自然な境界が好きであることも起こります。