2009-08-11 7 views
10

मैं Json.NET (क्रमबद्धता के लिए) और GeoAPI.NET (ज्यामिति परिभाषाओं के लिए) का उपयोग करके GeoJSON पर वस्तुओं को क्रमबद्ध करने के लिए सी # लाइब्रेरी बनाने का प्रयास कर रहा हूं।JSON.NET का उपयोग कर कस्टम जियोज़सन सीरियलाइज़र बनाने के सुझावों पर सुझाव?

मैंने सीरियलाइजेशन कार्यान्वयन के लिए दो अलग-अलग दृष्टिकोणों के बारे में सोचा है और मुझे स्पष्ट नहीं है कि कौन सा सबसे अच्छा तरीका होगा। वे हैं:

दृष्टिकोण 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; } 
} 

वस्तु Serializing तो के रूप में सरल किया जाएगा के रूप में:

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

इस दृष्टिकोण का लाभ यह है कि किसी भी व्यवसाय वस्तु एक में तब्दील किया जा सकता है GeoJSON ऑब्जेक्ट मानते हैं कि इसमें आवश्यक गुण हैं (उदाहरण के लिए, ज्यामिति)। नुकसान यह होगा कि serialization का समर्थन करने के लिए मुझे कई कस्टम विशेषताओं को बनाने की आवश्यकता होगी। इसके अतिरिक्त, इसका व्यापार वस्तु 'muddying' पर असर पड़ता है।

अंत में, मैंने अभी तक यह निर्धारित नहीं किया है कि यह दृष्टिकोण JSON.NET के साथ भी संभव है, हालांकि ऐसा लगता है कि यह होगा।

दृष्टिकोण 2 - कस्टम JsonConverter

दूसरा दृष्टिकोण विभिन्न प्रकारों के लिए कस्टम कन्वर्टर्स बनाने होते हैं। उदाहरण के लिए मेरे पास एक GeoJsonConverter हो सकता है कि किसी दिए गए प्रकार के ऑब्जेक्ट को पास करते समय, फ़ीचर कहें, 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; 

लाभ यहाँ है कि यह उन्हें आसानी से बनाया लगता है। मैंने साबित कर दिया है कि यह दृष्टिकोण एक बहुत ही सरल प्रोटोटाइप के माध्यम से संभव है। इसके अतिरिक्त, Feature कक्षा पहले ही परिभाषित है यदि मैं NetTopologySuite से लिंक करता हूं।

नुकसान यह होगा कि मेरी व्यावसायिक वस्तुओं को धारावाहिक होने से पहले Feature पर मैप करने की आवश्यकता होगी। हालांकि, इसे एक लाभ माना जा सकता है क्योंकि यह परतों के बीच एक प्राकृतिक decoupling प्रदान कर सकता है। बाद में दोनों मामलों और नेटोपोपोलॉजी सूइट में जियोएपीआई के साथ निश्चित रूप से तंग युग्मन होगा। मुझे लगता है कि मैं इसके साथ ठीक हूँ।

मुझे कई अन्य जियोज़सन सीरियलाइज़र जैसे GeoJson.NET के बारे में पता है, हालांकि मुझे एक दृष्टिकोण चाहिए जो जेसन.NET एपीआई के अनुरूप है क्योंकि यह पसंद का हमारा धारावाहिक है।

क्या आपको कोई स्पष्ट कारण दिखाई देता है कि एक दृष्टिकोण दूसरे पर क्यों पसंद किया जाएगा? शायद एक और दृष्टिकोण है जिसके बारे में मुझे पता नहीं है?

एफवाईआई, मैं दूसरे दृष्टिकोण की ओर झुका रहा हूं। ऐसा लगता है कि इसे कार्यान्वित करना आसान होगा और यह समग्र रूप से क्लीनर होगा। मैं डोमेन ऑब्जेक्ट्स और जियोज़सन ऑब्जेक्ट्स के बीच प्राकृतिक सीमा को भी पसंद करता हूं जो इसे बनाएगा।

उत्तर

2

व्यक्तिगत तौर पर मैं पहली पसंद की ओर झुक चाहते हैं, एक सरल कारण के लिए। यदि आप .NET ढांचे को देखते हैं, तो System.Xml.Serialization नामस्थान में आपके क्रमिकरण के लिए एक एनालॉग है। वहां वे लगभग वही करते हैं जो आप अपने पहले दृष्टिकोण में सुझाव दे रहे हैं।

हालांकि, अगर आप ऐसा विशेष रूप से उस तरह नहीं, मैं एक तिहाई दृष्टिकोण सुझाव देंगे: एक कस्टम क्रमांकन फ़ॉर्मेटर लिखें, System.Runtime.Serialization.IFormatter को लागू करने। यह आपको वस्तुओं के लिए मानक धारावाहिक नोटेशन और तंत्र का उपयोग करने की क्षमता देता है (जैसे [सीरियलज़ेबल] और आईएसरियलज़ेबल), लेकिन आप पहचानने में आसान उपयोग करने के लिए एक अच्छी तरह से मान्यता प्राप्त पैटर्न का पालन कर रहे हैं। प्लस एक अतिरिक्त बोनस के रूप में आप आसानी से अपने IFormatter कार्यान्वयन बाहर गमागमन

संपादित करें द्वारा सड़क के नीचे क्रमबद्धता के अन्य रूपों (बाइनरी, साबुन, अन्य कस्टम प्रारूपों) का समर्थन कर सकते हैं: http://geekswithblogs.net/luskan/archive/2007/07/16/113956.aspx

: यहाँ एक उदाहरण है
संबंधित मुद्दे