नोट: यदि मैं मूल प्रश्न में उल्लिखित ज्ञात प्रकार की समस्या के समाधान के बारे में पढ़ना चाहता हूं, तो मैं अपने उत्तर की शुरुआत में बहुत सारे विवरण में गया हूं, अंत में कूदें उत्तर का
प्रदर्शन
benchmarks मैं भाग गया के आधार पर, JavaScriptSerializer दूर अन्य विकल्पों की तुलना में धीमी है और क्रमानुसार करने के रूप में लंबे 2x लेने कर सकते हैं/एक वस्तु DataContractSerializer की तुलना में deserialize।
ज्ञात प्रकार
कहा कि, JavascriptSerializer अधिक लचीला में है कि यह आप के नाम प्रकार 'समय से आगे निर्दिष्ट करने के लिए की आवश्यकता नहीं है, और धारावाहिक JSON में कम से कम क्लीनर है के लिए कोई ज़रूरत नहीं शब्दकोशों के मामले (उदाहरण देखें here)।
कि लचीलापन आसपास प्रकार के नाम से जाना जाता दूसरा पहलू यह है कि यह है कि एक ही JSON स्ट्रिंग वापस मूल प्रकार के deserialize करने में सक्षम नहीं होगा।
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
और अगर मैं Dictinoary<string, object>
का एक उदाहरण बना सकते हैं और यह serializing से पहले यह करने के लिए Person
वर्ग का एक उदाहरण जोड़ें::
var dictionary = new Dictionary<string, object>();
dictionary.Add("me", new Person { Name = "Yan", Age = 30 });
var serializer = new new JavaScriptSerializer();
var json = serializer .Serialize(dictionary);
मैं हूँ उदाहरण के लिए, मैं एक साधारण Person
वर्ग है लगता है निम्नलिखित JSON {"me":{"Name":"Yan","Age":30}}
प्राप्त करें जो कि बहुत साफ है लेकिन किसी भी प्रकार की जानकारी से रहित है। तो माना जाता है, तो आप एक ही सदस्य परिभाषा के साथ दो वर्गों है या यदि Person
किसी भी अतिरिक्त सदस्यों को शुरू करने के बिना subclassed है:
public class Employee : Person
{
}
फिर वहाँ बस के लिए serializer गारंटी नहीं है कि JSON {"Name":"Yan","Age":30}
deserialized किया जा सकता है सक्षम होने के लिए कोई रास्ता नहीं है सही प्रकार के लिए।
आप JavaScriptSerializer का उपयोग कर {"me":{"Name":"Yan","Age":30}}
deserialize हैं, तो शब्दकोश में तुम वापस के साथ जुड़े मूल्य "मुझे" Person
का एक उदाहरण लेकिन बजाय एक Dictionary<string, object>
, एक सरल संपत्ति बैग नहीं है मिलता है।
आप एक Person
उदाहरण वापस पाने के लिए चाहते हैं, आप (आप सबसे शायद करना चाहते हैं, हालांकि होगा कभी नहीं!) कर सकता है परिवर्तित कि Dictionary<string, object>
ConvertToType
सहायक विधि का उपयोग कर:
var clone = serializer.Deserialize<Dictionary<string, object>>(json);
var personClone = serializer.ConverToType<Person>(clone["me"]);
दूसरी ओर, यदि आप उन JSON को सही प्रकार में deserializing के बारे में चिंता करने की आवश्यकता नहीं है और JSON serailization एक प्रदर्शन बाधा नहीं है (अपना कोड प्रोफाइल करें और पता लगाएं कि सीरियलाइजेशन पर कितना सीपीयू समय बिताया गया है यदि आपने पहले से ऐसा नहीं किया है) तो मैं कहूंगा बस जावास्क्रिप्ट Serializer का उपयोग करें।
इंजेक्शन ज्ञात प्रकार
, अगर दिन के अंत में, आप अभी भी DataContractSerializer का उपयोग करें और उन KnownTypes इंजेक्षन करने की जरूरत की जरूरत है, यहाँ दो चीजें आप की कोशिश कर सकते हैं।
1) ज्ञात प्रकारों की सरणी को DataContractSerializer constructor पर पास करें।
2) DataContractSerializer के लिए आपकी रुचि का प्रकार) का पता लगाने का साधन के साथ DataContractResolver का एक उपवर्ग (दर्रा constructor
आप एक तरह के 'ज्ञात प्रकार रजिस्ट्री' है कि प्रकार का ट्रैक रखता है बना सकते हैं कि शब्दकोश में जोड़ा जा सकता है, और यदि आप सभी प्रकार है कि आप DataContractSerializer को इंजेक्षन करने की आवश्यकता होगी नियंत्रित करते हैं, आप सबसे सरल बात की कोशिश कर सकते हैं:
एक प्रकार जोड़ने के लिए स्थिर तरीकों के साथ एक KnownTypeRegister
कक्षा बनाएं ज्ञात प्रकारों की सूची में:
var serializer = new DataContractSerializer(typeof(Dictionary<string, object>), KnownTypeRegister.Get());
: जब आप serializer निर्माण
[DataContract]
public class Person
{
static Person()
{
KnownTypeRegister.Add(typeof(Person));
}
[DataMember]
public string Name { get; set; }
[DataMember]
public int Age { get; set; }
}
रजिस्टर से भी जाना जाता है प्रकार के सरणी प्राप्त करें:
public static class KnownTypeRegister
{
private static readonly ConcurrentBag _knownTypes = new ConcurrentBag();
public static void Add(Type type)
{
_knownTypes.Add(type);
}
public static IEnumerable Get()
{
return _knownTypes.ToArray();
}
}
एक स्थिर निर्माता कि रजिस्टर के साथ प्रकार पंजीकृत करता जोड़े
अधिक गतिशील/बेहतर विकल्प possibl हैं ई लेकिन वे कार्यान्वित करने के लिए और भी मुश्किल हैं, यदि आप गतिशील ज्ञात प्रकार के रिज़ॉल्यूशन के बारे में अधिक पढ़ना चाहते हैं, तो here विषय पर जुवाल लोवी के एमएसडीएन आलेख पर नज़र डालें। इसके अलावा, कार्लोस फिगुइरा द्वारा this blog post भी आगे बढ़ने के तरीके जैसे अधिक गतिशील तकनीकों पर विवरण में जाता है, जब आप इस विषय पर होते हैं तो पढ़ने के लायक होते हैं!
मुझे पहले से ही इस तरह के लोगों को खुशी है। कृपया तर्कों के जवाब देने के लिए परेशान न हों कि डब्ल्यूसीएफ को इत्यादि के लिए कैसे नहीं बनाया गया था, आदि। यदि आप ज्ञात तरीके से हैं या यदि आप वहां हैं और वैध कारणों के लिए छोड़ दिया है तो क्या आप हमें बता सकते हैं कि क्या आप हमें बता सकते हैं (क्या कारणों?)। – tishma