我將嘗試創建一個C#庫,以使用Json.NET(用於序列化)和GeoAPI.NET(用於幾何定義)將對象序列化到GeoJSON。關於如何使用JSON.NET創建自定義GeoJson序列化程序的建議?
我想過兩種不同的序列化實現方法,我不清楚哪一種方法是最好的方法。它們是:
方法1 - 自定義屬性
第一種方法涉及創建一個可以應用到任何類修改系列化幾個自定義屬性。舉例來說,一類可能被裝飾,像這樣:
[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; }
}
序列化對象將被簡單:
JsonNetResult jsonNetResult = new JsonNetResult();
jsonNetResult.Formatting = Formatting.Indented;
jsonNetResult.Data = building;
return jsonNetResult;
這種方法的優點是,任何業務對象也可以變成一個GeoJSON對象假定它具有所需的屬性(例如幾何)。缺點是我需要創建一些自定義屬性來支持序列化。此外,這具有「混淆」業務對象的影響。
最後,我還沒有確定這種方法是否可能與JSON.NET,儘管它似乎是。
方法2 - 自定義JsonConverter
第二種方法涉及創建定製各類轉換器。例如,我可能有一個GeoJsonConverter,它在傳遞給定類型的對象時說Feature,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);
}
}
我會再能序列化到GeoJSON的,像這樣:
JsonNetResult jsonNetResult = new JsonNetResult();
jsonNetResult.Formatting = Formatting.Indented;
jsonNetResult.SerializerSettings.Converters.Add(new GeoJsonFeatureConverter());
jsonNetResult.Data = building;
這裏的好處是,這似乎更容易創建。我已經證明,這種方法可以通過一個非常簡單的原型。此外,如果我鏈接到NetTopologySuite,則Feature
類已經定義。
缺點是我的業務對象在序列化之前需要映射到Feature
。雖然這可能被認爲是一個優點,因爲這可能會提供層之間的自然解耦。在這兩種情況下,GeoAPI和NetTopologySuite在後面肯定會緊密結合。我覺得我沒關係。
我知道其他幾個GeoJson序列化器可用,如GeoJson.NET但是我想要一種與Json.NET API一致的方法,因爲這是我們選擇的序列化器。
您是否看到明顯的原因,爲什麼一種方法比另一種方法更受歡迎?也許還有另一種我不知道的方法?
僅供參考,我傾向於第二種方法。看起來實施起來會更容易,而且整體上會更乾淨。我也碰巧喜歡它創建的領域對象和GeoJson對象之間的自然邊界。