प्रोजेक्ट एक Asp.Net वेब API वेब सेवा है।कस्टम जेसन कनवर्टर (वेब एपीआई) से Json.Net JsonSerializer में स्वयं संदर्भ लूप
मेरे पास एक प्रकार का पदानुक्रम है जिसे मुझे जेसन से और से क्रमबद्ध करने में सक्षम होना चाहिए, इसलिए मैंने इस SO: How to implement custom JsonConverter in JSON.NET to deserialize a List of base class objects? से कोड लिया है, और कनवर्टर को मेरे पदानुक्रम के बेस क्लास पर लागू किया है; कुछ इस तरह (वहाँ छद्म कोड irrelevancies को छिपाने के लिए यहाँ है):
[JsonConverter(typeof(TheConverter))]
public class BaseType{
///note the base of this type here is from the linked SO above
private class TheConverter : JsonCreationConverter<BaseType>{
protected override BaseType Create(Type objectType, JObject jObject){
Type actualType = GetTypeFromjObject(jObject); /*method elided*/
return (BaseType)Activator.CreateInstance(actualType);
}
}
}
public class RootType {
public BaseType BaseTypeMember { get; set; }
}
public class DerivedType : BaseType {
}
तो अगर मैं एक RootType
उदाहरण जिसका BaseTypeMember
DerivedType
का एक उदाहरण के बराबर था, तो यह उस प्रकार का एक उदाहरण में वापस deserialized किया जाएगा deserialize ।
रिकॉर्ड के लिए, इन JSON ऑब्जेक्ट्स में '$type'
फ़ील्ड होता है जिसमें वर्चुअल टाइप नाम होते हैं (पूर्ण नेट नाम नहीं हैं) ताकि मैं जेएसओएन में प्रकारों का समर्थन कर सकूं जबकि वास्तव में नियंत्रित किया जा सकता है कि किस प्रकार को क्रमबद्ध और deserialized किया जा सकता है।
अब यह अनुरोध से मूल्यों को deserializing के लिए वास्तव में अच्छी तरह से काम करता है; लेकिन मुझे serialization के साथ एक मुद्दा है। यदि आप लिंक किए गए एसओ, और वास्तव में जेसन.Net चर्चा को शीर्ष उत्तर से लिंक करते हैं, तो आप देखेंगे कि मैं जिस बेस कोड का उपयोग कर रहा हूं वह पूरी तरह से deserialization के आसपास तैयार है; इसके उपयोग के उदाहरणों के साथ serializer के मैन्युअल निर्माण दिखा रहा है। इस JsonCreationConverter<T>
द्वारा तालिका में लाए गए JsonConverter
कार्यान्वयन को आसानी से NotImplementedException
फेंकता है।
अब, वेब एपीआई अनुरोध के लिए एक एकल फॉर्मेटर का उपयोग करने के तरीके के कारण, मुझे WriteObject
विधि में 'मानक' क्रमिकरण को लागू करने की आवश्यकता है।
मैं इस बिंदु पर तनाव होना चाहिए कि मैं सब कुछ था अपने प्रोजेक्ट के इस हिस्से पर आरंभ करने से पहले त्रुटियों बिना ठीक से serializing।
तो मैं इस किया था:
public override void WriteJson(JsonWriter writer,
object value,
JsonSerializer serializer)
{
serializer.Serialize(writer, value);
}
लेकिन मैं एक JsonSerializationException
मिलती है: Self referencing loop detected with type 'DerivedType'
, जब वस्तुओं में से एक धारावाहिक है। दोबारा - अगर मैं कनवर्टर विशेषता को हटाता हूं (मेरी कस्टम सृजन को अक्षम करता है) तो यह ठीक काम करता है ...
मुझे एहसास है कि इसका मतलब है कि मेरा सीरियलाइजेशन कोड वास्तव में कनवर्टर को उसी ऑब्जेक्ट पर ट्रिगर कर रहा है, जो बदले में serializer फिर से कॉल - विज्ञापन मतली। की पुष्टि की - मेरा उत्तर देख
तो क्या कोड चाहिए मैं WriteObject
में लेखन किया है कि एक ही 'मानक' क्रमबद्धता कि काम करता है क्या करेंगे?
अच्छा क्यू एंड ए, लेकिन यह उनका कहना है कि serializer कर रही है लायक है सही बात: यह कस्टम धारावाहिकों की तलाश में ऑब्जेक्ट का निरीक्षण करता है और एक पाता है। यदि आप कुछ और करते हैं तो आपको चिंतित होना चाहिए अन्यथा यह विदेशी वर्गों पर कस्टम कन्वर्टर्स का सम्मान नहीं कर सकता है। –
@RupertRawnsley yep मैं उस –