मैं 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 एपीआई के अनुरूप है क्योंकि यह पसंद का हमारा धारावाहिक है।
क्या आपको कोई स्पष्ट कारण दिखाई देता है कि एक दृष्टिकोण दूसरे पर क्यों पसंद किया जाएगा? शायद एक और दृष्टिकोण है जिसके बारे में मुझे पता नहीं है?
एफवाईआई, मैं दूसरे दृष्टिकोण की ओर झुका रहा हूं। ऐसा लगता है कि इसे कार्यान्वित करना आसान होगा और यह समग्र रूप से क्लीनर होगा। मैं डोमेन ऑब्जेक्ट्स और जियोज़सन ऑब्जेक्ट्स के बीच प्राकृतिक सीमा को भी पसंद करता हूं जो इसे बनाएगा।