2015-11-06 4 views
13

.NET दुनिया में, जब ऑब्जेक्ट क्रमबद्धता की बात आती है, तो यह आमतौर पर रनटाइम पर ऑब्जेक्ट के फ़ील्ड और गुणों का निरीक्षण करने में जाता है। इस नौकरी के लिए प्रतिबिंब का उपयोग आमतौर पर धीमा होता है और वस्तुओं के बड़े सेट से निपटने के दौरान अवांछनीय होता है। दूसरा तरीका आईएल उत्सर्जन या बिल्डिंग अभिव्यक्ति पेड़ों का उपयोग कर रहा है जो प्रतिबिंब पर महत्वपूर्ण प्रदर्शन लाभ प्रदान करते हैं। और उत्तरार्द्ध से निपटने के दौरान उत्तरार्द्ध सबसे आधुनिक पुस्तकालयों को चुनते हैं। हालांकि रनटाइम पर आईएल बनाने और उत्सर्जित करने में समय लगता है, और निवेश केवल तभी भुगतान किया जाता है जब यह जानकारी उसी प्रकार की वस्तुओं के लिए कैश और पुन: उपयोग की जाती है।क्या जेसन.नेट कैश प्रकार 'क्रमबद्धता जानकारी है?

जेसन.नेट का उपयोग करते समय, यह स्पष्ट नहीं है कि ऊपर वर्णित विधि का उपयोग किया जाता है, और यदि बाद में वास्तव में उपयोग किया जाता है, तो कैशिंग का उपयोग किया जाता है या नहीं।

उदाहरण के लिए, जब मैं कार्य करें:

JsonConvert.SerializeObject(new Foo { value = 1 }); 

करता Json.NET फू के सदस्य पहुँच जानकारी और कैश का निर्माण बाद में इसे पुन: उपयोग के लिए?

+4

मेरे पास आपके लिए कोई निश्चित उत्तर नहीं है, लेकिन [Json.NET] के लिए स्रोत (https://github.com/JamesNK/Newtonsoft.Json) github पर है और यह कहता है कि "Json.NET है .NET के लिए एक लोकप्रिय उच्च प्रदर्शन JSON ढांचा "। यदि आप स्रोत पर कैश की त्वरित खोज करते हैं तो आप पाएंगे कि वास्तव में बहुत सी कैशिंग चल रही है। – KiwiPiet

उत्तर

12

जेसन.NET कैश अपने IContractResolver कक्षा DefaultContractResolver और CamelCasePropertyNamesContractResolver के अंदर धारावाहिक जानकारी टाइप करें। जब तक आप कस्टम अनुबंध रिज़ॉल्वर निर्दिष्ट नहीं करते हैं, तो यह जानकारी कैश और पुन: उपयोग की जाती है।

DefaultContractResolver के लिए एक वैश्विक स्थैतिक उदाहरण आंतरिक रूप से बनाए रखा जाता है कि Json.NET तब भी उपयोग करता है जब एप्लिकेशन अपने अनुबंध समाधान को निर्दिष्ट नहीं करता है। दूसरी तरफ CamelCasePropertyNamesContractResolver, स्थिर तालिकाओं को बनाए रखता है जो सभी मामलों में साझा किए जाते हैं। (मेरा मानना ​​है कि विरासत मुद्दों से असंगतता उत्पन्न होती है; विवरण के लिए here देखें।)

इन दोनों प्रकारों को पूरी तरह से थ्रेड-सुरक्षित होने के लिए डिज़ाइन किया गया है, इसलिए धागे के बीच साझा करना कोई समस्या नहीं होनी चाहिए।

यदि आप अपना अनुबंध समाधानकर्ता चुनना चुनते हैं, तो जानकारी को केवल कैश और पुन: उपयोग किया जाएगा यदि आप अनुबंध रिज़ॉल्वर इंस्टेंस को कैश और पुन: उपयोग करते हैं। इस प्रकार, "स्टेटलेस" रिसोल्वर (जो कि वर्तमान उदाहरण के आधार पर उनकी वापसी मूल्यों को संशोधित नहीं किया जा रहा धारावाहिक, या अन्य क्रम की स्थिति) के लिए, Newtonsoft recommends: इष्टतम के लिए आपके आवेदन के भीतर अनुबंध रिसोल्वर के

कैश उदाहरणों प्रदर्शन। DefaultContractResolver का एक उपवर्ग में कैशिंग की गारंटी के लिए

एक रणनीति अपने निर्माता संरक्षित या निजी हो बनाने के लिए, और एक वैश्विक स्थिर उदाहरण प्रदान करना है।

var json = JsonConvert.SerializeObject(someObject, new JsonSerializerSettings { ContractResolver = PascalCaseToUnderscoreContractResolver.Instance }); 
:

public class PascalCaseToUnderscoreContractResolver : DefaultContractResolver 
{ 
    protected PascalCaseToUnderscoreContractResolver() : base() { } 

    // As of 7.0.1, Json.NET suggests using a static instance for "stateless" contract resolvers, for performance reasons. 
    // http://www.newtonsoft.com/json/help/html/ContractResolver.htm 
    // http://www.newtonsoft.com/json/help/html/M_Newtonsoft_Json_Serialization_DefaultContractResolver__ctor_1.htm 
    // "Use the parameterless constructor and cache instances of the contract resolver within your application for optimal performance." 
    static PascalCaseToUnderscoreContractResolver instance; 

    // Using an explicit static constructor enables lazy initialization. 
    static PascalCaseToUnderscoreContractResolver() { instance = new PascalCaseToUnderscoreContractResolver(); } 

    public static PascalCaseToUnderscoreContractResolver Instance { get { return instance; } } 

    static string PascalCaseToUnderscore(string name) 
    { 
     if (name == null || name.Length < 1) 
      return name; 
     var sb = new StringBuilder(name); 
     for (int i = 0; i < sb.Length; i++) 
     { 
      var ch = char.ToLowerInvariant(sb[i]); 
      if (ch != sb[i]) 
      { 
       if (i > 0) // Handle flag delimiters 
       { 
        sb.Insert(i, '_'); 
        i++; 
       } 
       sb[i] = ch; 
      } 
     } 
     return sb.ToString(); 
    } 

    protected override string ResolvePropertyName(string propertyName) 
    { 
     return PascalCaseToUnderscore(propertyName); 
    } 
} 

कौन सा आप की तरह का प्रयोग करेंगे: (। बेशक यह केवल उचित है, तो रिसोल्वर हमेशा एक ही परिणाम वापस चाहिए) जैसे, this question से प्रेरित है, यहाँ अनुबंध समाधानकर्ता को रेखांकित करने के लिए एक पास्कल मामला है

+1

इस कैश को साफ़ करने के लिए कैसे करें – singsuyash

संबंधित मुद्दे