2009-08-11 30 views
10

Tôi sẽ cố gắng tạo thư viện C# để sắp xếp các đối tượng thành GeoJSON sử dụng Json.NET (để tuần tự hóa) và GeoAPI.NET (đối với định nghĩa hình học).Gợi ý về cách tạo bộ nối tiếp GeoJson tùy chỉnh bằng JSON.NET?

Tôi đã nghĩ về hai cách tiếp cận khác nhau để thực hiện tuần tự hóa và tôi không rõ phương pháp nào sẽ là phương pháp tốt nhất. Đó là:

Cách tiếp cận 1 - Tuỳ chỉnh thuộc tính

Phương pháp đầu tiên liên quan đến việc tạo ra một số thuộc tính tùy chỉnh mà có thể được áp dụng cho bất kỳ lớp để thay đổi tuần tự. Ví dụ, một lớp có thể được trang trí như vậy:

[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; } 
} 

Serializing đối tượng sau đó sẽ đơn giản như:

JsonNetResult jsonNetResult = new JsonNetResult(); 
jsonNetResult.Formatting = Formatting.Indented; 
jsonNetResult.Data = building; 
return jsonNetResult; 

Ưu điểm của phương pháp này là bất kỳ đối tượng kinh doanh có thể được biến thành một Đối tượng GeoJSON giả sử nó có các thuộc tính bắt buộc (ví dụ, Hình học). Điểm bất lợi là tôi cần phải tạo một số thuộc tính tùy chỉnh để hỗ trợ tuần tự hóa. Ngoài ra, điều này có ảnh hưởng của 'muddying' đối tượng kinh doanh.

Cuối cùng, tôi chưa xác định được liệu phương pháp này có thể thực hiện được với JSON.NET hay không, mặc dù có vẻ như nó sẽ xảy ra.

Cách tiếp cận 2 - Tuỳ chỉnh JsonConverter

Cách tiếp cận thứ hai liên quan đến việc tạo ra bộ chuyển đổi tùy chỉnh với nhiều loại khác nhau. Ví dụ tôi có thể có một GeoJsonConverter rằng khi thông qua một đối tượng của một loại nhất định, nói tính năng, đối tượng GeoJSON được tạo ra. Điều này có thể trông giống như:

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); 
    } 
} 

Sau đó tôi sẽ có thể serialize để GeoJSON như vậy:

JsonNetResult jsonNetResult = new JsonNetResult(); 
jsonNetResult.Formatting = Formatting.Indented; 
jsonNetResult.SerializerSettings.Converters.Add(new GeoJsonFeatureConverter()); 
jsonNetResult.Data = building; 

Ưu điểm ở đây là điều này dường như dễ dàng hơn để tạo ra. Tôi đã chứng minh rằng cách tiếp cận này là có thể thông qua một nguyên mẫu rất đơn giản. Ngoài ra, lớp Feature đã được xác định nếu tôi liên kết đến NetTopologySuite.

Điểm bất lợi là các đối tượng kinh doanh của tôi cần phải được ánh xạ tới Feature trước khi được đăng. Mặc dù, điều này có thể được coi là một lợi thế vì điều này có thể cung cấp một sự tách rời tự nhiên giữa các lớp. Chắc chắn sẽ có sự kết hợp chặt chẽ với GeoAPI trong cả hai trường hợp và NetTopologySuite sau này. Tôi nghĩ tôi ổn với điều đó.

Tôi biết một số trình nối tiếp GeoJson khác có sẵn như GeoJson.NET tuy nhiên tôi muốn một cách tiếp cận phù hợp với API Json.NET vì đây là trình nối tiếp lựa chọn của chúng tôi.

Bạn có thấy bất kỳ lý do rõ ràng nào tại sao một cách tiếp cận sẽ được ưu tiên hơn cách khác không? Có lẽ có một cách tiếp cận khác mà tôi không biết?

FYI, tôi đang hướng tới phương pháp thứ hai. Có vẻ như nó sẽ dễ dàng hơn để thực hiện và nó sẽ sạch hơn tổng thể. Tôi cũng xảy ra như ranh giới tự nhiên giữa các đối tượng miền và các đối tượng GeoJson mà nó sẽ tạo ra.

Trả lời

2

Cá nhân tôi nghiêng về lựa chọn đầu tiên, vì một lý do đơn giản. Nếu bạn nhìn vào khung công tác .NET, có một sự tương tự với việc tuần tự hóa của bạn trong không gian tên System.Xml.Serialization. Ở đó họ làm gần như chính xác những gì bạn đang đề xuất trong cách tiếp cận đầu tiên của bạn.

Tuy nhiên, nếu bạn không đặc biệt thích điều đó, tôi sẽ đề xuất phương pháp tiếp cận thứ ba: Viết một trình định dạng tuần tự hóa tùy chỉnh, triển khai System.Runtime.Serialization.IFormatter. Điều này mang lại cho bạn khả năng sử dụng ký hiệu serialization tiêu chuẩn và các cơ chế cho các đối tượng của bạn (như [Serializable] và ISerializable), nhưng bạn đang theo dõi một mẫu được công nhận tốt, làm cho việc sử dụng dễ dàng nhận ra. Ngoài ra như một tiền thưởng thêm, bạn có thể dễ dàng hỗ trợ các hình thức khác của serialization (nhị phân, xà phòng, các định dạng tùy chỉnh khác) xuống đường bằng cách trao đổi thực hiện IFormatter bạn

Edit: đây là một ví dụ: http://geekswithblogs.net/luskan/archive/2007/07/16/113956.aspx

Các vấn đề liên quan