मेरे पास एक कनवर्टर है जिसे मैं केवल deserializing जब उपयोग करना चाहता हूँ। तो मैंने कैनव्राइट को झूठा करने के लिए सेट किया है, जो ठीक काम करता है और सब कुछ ठीक से serializes। जेसन स्ट्रिंग में तब एक ऑब्जेक्ट ग्राफ़ होता है जिसमें सांता क्लॉज आइटम की एक सरणी के साथ सांता क्लॉज चयन होता है और एक $ प्रकार इंगित करता है कि वे ठोस प्रकार सांता क्लॉज हैं।JSON.Net संग्रह आइटम के लिए CanConvert को कॉल नहीं कर रहा है?
हालांकि, जब यह deserializing के दौरान सांता क्लॉस के संग्रह से मुकाबला करता है, तो यह कभी भी कैनकॉनवर्ट नहीं कहता है (मेरे पास ब्रेक पॉइंट है और सांता क्लॉस कोलेक्शन देखें, जारी रखने के लिए F5 दबाएं, फिर उसमें किसी आइटम का सामना करते समय ब्रेक पॉइंट फिर से मारा जाना चाहिए सांता क्लॉस का संग्रह, लेकिन यह नहीं करता है)। जब यह सांता क्लाउस आइटम पर जाता है तो यह CanConvert को कॉल करने का प्रयास नहीं कर रहा है। उस कनवर्टर को यह भी जांचने के लिए कि क्या मेरा कनवर्टर इसे संभाल लेगा, यह जांचने के लिए कैनकॉन्टर को कॉल किए बिना, यह काम नहीं करेगा क्योंकि कक्षा में कोई डिफॉल्ट कन्स्ट्रक्टर नहीं है और संपत्ति-नाम मिलान सम्मेलनों के साथ कोई कन्स्ट्रक्टर नहीं है:
SantaClaus टाइप करने के लिए उपयोग करने के लिए एक कन्स्ट्रक्टर खोजने में असमर्थ। एक वर्ग या तो एक डिफ़ॉल्ट कन्स्ट्रक्टर होना चाहिए, तर्कों के साथ एक कन्स्ट्रक्टर या JsonConstructor विशेषता के साथ चिह्नित एक कन्स्ट्रक्टर होना चाहिए।
मुझे समझ में क्यों मैं इस त्रुटि मिलती है, लेकिन समस्या यह इंगित करता है कि Json.net, वस्तु deserialize करने की कोशिश की बजाय जाँच करें और देखें कि मेरी कनवर्टर बजाय अक्रमांकन को संभालने के लिए चाहता था CanConvert बुलाने की है।
संग्रह में प्रत्येक आइटम के लिए CanConvert क्यों नहीं कहा जा रहा है?
मेरे कनवर्टर:
class SantaClaus2JsonConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(SantaClaus);
}
/// <summary>
/// Deserializes a SantaClaus as a SantaClausEx which has a matching constructor that allows it to deserialize naturally.
/// </summary>
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
return serializer.Deserialize<SantaClausEx>(reader);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
serializer.Serialize(writer, value);
}
public override bool CanRead
{
get
{
return true;
}
}
public override bool CanWrite
{
get
{
return false;//We only need this converter when reading.
}
}
}
SantaClausEx है सिर्फ एक नाम दिया पैरामीटर गुण मिलान करने के लिए के साथ एक निर्माता को जोड़ने के लिए Santaclaus से विरासत:
class SantaClaus //a third party class I can't modify
{
string Name {get;set;}
public SantaClaus(string santaClauseName) { this.Name = santaClauseName }
}
class SantaClausEx:SantaClaus
{
//provide a constructor with param names matching property names
public SantaClausEx(string name) : base(name)
}
Json.net एक Santaclaus deserialize नहीं कर सकते, लेकिन यह एक SantaClauseEx deserialize कर सकते हैं।
मैं हर जगह उस सांता क्लॉजएक्स कक्षा का उपयोग करता हूं और यह ठीक काम करता है, लेकिन मैं इसे स्वचालित रूप से करने के लिए कनवर्टर बनाना चाहता था।
इस JSON संग्रह के लिए कैसा दिखता है:
SantaClausCollection: [
{
$type: "SantaClaus, XMasClasses.NET20"
Name: "St. Bob"
},
{
$type: "SantaClaus, XMasClasses.NET20"
Name: "St. Jim"
}
]
आप वास्तव में कन्वर्ट कॉल कैसे कर रहे हैं? Serialize/Deserialize विधियों में आम तौर पर ओवरलोड होते हैं जो लागू होने पर कनवर्टर्स का उपयोग करने के लिए स्वीकार करते हैं। आपका कनवर्टर जादुई रूप से सिर्फ इसलिए नहीं कहा जाएगा क्योंकि यह मौजूद है, इसे उन कन्वर्टर्स में से एक के रूप में पारित किया जाना चाहिए। –