मैं इस तरह Json.Net का उपयोग करके अपने ऑब्जेक्ट ParticleSystem ऑब्जेक्ट को पॉप्युलेट करने का प्रयास कर रहा हूं:

public void LoadJson(string path, object targetObject)
{
   using (var sw = new StreamReader(path))
        using (var reader = new JsonTextReader(sw))
            JsonHelpers.DefaultSerializer.Populate(reader, targetObject);
}

निम्नलिखित जेसन फ़ाइल के साथ:

{
  "TexturePath": "Particles/snow",
  "MaxParticles": 8500
}

यहाँ कक्षा का हिस्सा है (पूरी बात पोस्ट करने के लिए बहुत बड़ी है)

public class ParticleSystem : Entity3D
{
        public int MaxParticles;
        public string TexturePath { get; set; } = "Textures/default_diffuse";

        public void Load()
        {
            LoadJson("Data/Particles/SnowSettings.json", this);
        }
        etc...
}

हाउवर, किसी भी तरह से मैं LoadJson() विधि को कॉल करने का प्रयास करता हूं, ऑब्जेक्ट में कोई मान पॉप्युलेट नहीं होता है।

जब मैं इस तरह एक नई कक्षा बनाता हूं, और इसे ठीक उसी तरह से कॉल करता हूं, तो कक्षा उसी फ़ाइल और उसी विधि का उपयोग करके अपेक्षित रूप से पॉप्युलेट होती है। मैंने परीक्षण के लिए कुछ मूल वर्ग जोड़े हैं कि क्या विरासत कुछ भी तोड़ती है, क्योंकि मूल वर्ग में कई विरासत हैं।

    class TestClass : sub<float>
    {
        public int MaxParticles;
        public string TexturePath { get; set; } = "Textures/default_diffuse";

        public void Load()
        {
            LoadJson("Data/Particles/SnowSettings.json", this);
        }
    }
    class sub<T> : sub2
    {

    }
    class sub2
    {

    }

ऐसा किस कारण से हो रहा होगा? मैंने त्रुटि लॉगिंग सक्षम की है, लेकिन मुझे कुछ नहीं मिला। क्या पॉप्युलेट किया जा रहा है/नहीं किया जा रहा है, इसका लॉग प्राप्त करने का कोई तरीका है? या मैं इसे कैसे डिबग कर सकता हूं और मूल के पॉप्युलेट नहीं होने का कारण ढूंढ सकता हूं?

संपादित करें और उत्तर दें:

काफी जटिल पदानुक्रम पेड़ों में जांच के बाद कि यह हिस्सा था, और इस प्रकार पूरी तरह से पोस्ट नहीं किया जा सका, मुझे अंततः पता चला कि मेरी समस्या का कारण क्या था। यह पता चला है कि आधार वर्गों में से एक में विशेषता थी:

[JsonObject(MemberSerialization.OptIn)]

जिसका निम्नलिखित विवरण है

केवल Newtonsoft.Json.JsonPropertyAttribute या System.Runtime.Serialization.DataMemberAttribute के साथ चिह्नित सदस्यों को क्रमबद्ध किया जाता है। इस सदस्य क्रमांकन मोड को System.Runtime.Serialization.DataContractAttribute के साथ वर्ग को चिह्नित करके भी सेट किया जा सकता है।

जबकि मैं देख सकता हूं कि यह क्रमबद्धता को कैसे प्रभावित करता है, ऐसा लगता है कि यह पूरी तरह से स्पष्ट नहीं है कि इसमें deseriaization भी शामिल है और यहां तक ​​​​कि Populate() विधियां उन्हें अनदेखा करती हैं, भले ही वे JSON फ़ाइल में मौजूद हों। मुझे लगता है कि इस तरह के व्यवहार को खोजने के लिए इसे कम से कम ट्रेसर में लॉग इन किया जाना चाहिए।

मैंने एक Tracer को उत्तर के रूप में सक्षम करने के लिए उत्तर को चिह्नित किया है और अपने विशिष्ट मामले के लिए ये विवरण यहां प्रदान करता हूं, क्योंकि उस उत्तर ने मेरे द्वारा पूछे गए वास्तविक प्रश्न का उत्तर दिया था।

-2
jsmars 14 सितंबर 2018, 17:33

1 उत्तर

सबसे बढ़िया उत्तर

यह पता लगाने के लिए कि क्रमांकन में क्या गलत होता है, आप ट्रेसिंग का उपयोग कर सकते हैं।

धारावाहिक के TraceWriter गुण को एक ट्रेसराइटर पर सेट करें जिसे आप संदिग्ध संदेशों के लिए स्कैन कर सकते हैं।

उदाहरण के लिए:

public void LoadJson(string path, object targetObject)
{
   using (var sw = new StreamReader(path))
   {
        using (var reader = new JsonTextReader(sw))
        {
            var traceWriter = new MemoryTraceWriter();
            var serializer = JsonHelpers.DefaultSerializer;

            serializer.TraceWriter = traceWriter;
            serializer.Populate(reader, targetObject);

            Console.WriteLine(traceWriter);
        }
    }
}

यह बिल्कुल सर्वोत्तम अभ्यास नहीं है, लेकिन यह आपको एक संकेत देना चाहिए कि डिबगिंग के दौरान आपकी समस्या क्या है।

1
nvoigt 14 सितंबर 2018, 17:59