2009-08-11 37 views
10

我將嘗試創建一個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對象之間的自然邊界。

回答

2

我個人傾向於第一選擇,原因很簡單。如果你看看.NET框架,在System.Xml.Serialization命名空間中有一個類似於你的序列化的例子。在那裏,他們幾乎完全按照你的第一種方法提出的建議。但是,如果你不特別喜歡那樣,我會建議第三種方法:編寫一個自定義序列化格式化程序,實現System.Runtime.Serialization.IFormatter。這使您能夠爲對象使用標準的序列化符號和機制(如[Serializable]和ISerializable),但是您正在遵循一個公認的模式,使用起來很容易識別。另外作爲一個額外的好處,你可以換掉IFormatter實施

編輯輕鬆支持其他形式的序列化(二進制,肥皂,其他自定義格式)的道路:這裏有一個例子:http://geekswithblogs.net/luskan/archive/2007/07/16/113956.aspx

相關問題