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