2009-08-11 9 views
10

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オブジェクトの間の自然な境界が好きであることも起こります。

答えて

2

私は単純な理由から個人的には最初の選択に傾いています。 .NETフレームワークを見ると、System.Xml.Serialization名前空間のシリアライゼーションに類似したものがあります。彼らはあなたの最初のアプローチであなたが提案していることをほぼ正確に行います。

しかし、特にそうでない場合は、3番目の方法をお勧めします。カスタムのシリアル化フォーマッタを作成し、System.Runtime.Serialization.IFormatterを実装します。これにより、(SerializableとISerializableのような)あなたのオブジェクトに標準的なシリアライズ表記法とメカニズムを使用できるようになりますが、認識しやすいパターンに従っています。プラス追加ボーナスとして、あなたは簡単にIFormatter実装

編集をスワップアウトすることにより、道連載の他の形式(バイナリ、石鹸、他のカスタムフォーマット)をサポートすることができます:ここでの例です:http://geekswithblogs.net/luskan/archive/2007/07/16/113956.aspx

関連する問題