.net DataContractSerializer का उपयोग करके, "अपेक्षित टाइप नहीं करें"-लेकिन यह सिर्फ एक साधारण वर्ग है, कोई मजाकिया सामान नहीं है?




xml serialization (6)

रिपोर्ट किया जा रहा अपवाद VDB_Sync.Model.Constant के लिए है। इसका मतलब यह है कि कहीं और श्रृंखला को आगे बढ़ाया जाता है, इस वर्ग को दूसरी कक्षा में खींचा जा रहा है और वह वर्ग धारावाहिक है।

मुद्दा यह है कि इस वर्ग में कॉन्स्टेंट को कैसे एम्बेड किया गया है (उदाहरण के लिए, यदि यह संग्रह या जेनेरिक सूची में है) पर निर्भर करता है, तो डेटाकंट्रैक्टसेरियलाइज़र deserialization के दौरान अपनी उपस्थिति के लिए तैयार नहीं किया जा सकता है।

इसे हल करने के लिए, आपको उस श्रेणी में ज्ञात-प्रकार विशेषता लागू करने की आवश्यकता है जिसमें कॉन्स्टेंट शामिल है। आपके VDB_SessionController कोड के आधार पर, मुझे संदेह है कि यह VDB_SessionController

तो, KnownType विशेषता के साथ इस वर्ग को सजाने का प्रयास करें:

[KnownType(typeof(VDB_Sync.Model.Konstant)]
public class VDB_SessionController

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

using System;
using System.Runtime.Serialization;

namespace VDB_Sync.Model
{
[DataContract(Name="Konstant")]
public class Konstant : DataFelt
{
    [DataMember]
    private MySqlDbType mydataType;
    [DataMember]
    private object value;

    public Konstant(string navn, MySqlDbType dataType, object value)
        : base(navn, dataType, "*Konstant", false, false)
    {
        //this.navn = navn;
        this.mydataType = dataType;
        this.value = value;

        if (navn.Contains("*Løbenummer"))
        {
            navn = "*Konstant: " + Convert.ToString(value);
        }
    }

    public object Value
    {
        get
        {
            return value;
        }
    }

}
}

यह मुझे यह है:

डेटा अनुबंध नाम 'कॉन्स्टेंट: http: //schemas.datacontract.org/2004/07/VDB_Sync.Model' की अपेक्षा नहीं है 'VDB_Sync.Model.Constant' टाइप करें। DataContractResolver का उपयोग करने पर विचार करें या ज्ञात प्रकारों की सूची में स्थिर रूप से ज्ञात किसी भी प्रकार को जोड़ें - उदाहरण के लिए, KnownTypeAttribute विशेषता का उपयोग करके या उन्हें DataContractSerializer को ज्ञात ज्ञात प्रकारों की सूची में जोड़कर।

* सहायता जो मैंने पाया है अब तक संग्रह और प्रकार के लिए इंगित करता है। मेरे पास मेरी कक्षा में एक enum (MySqlDbType) है - लेकिन इसे प्राप्त करें: मुझे भी वही त्रुटि मिलती है जब मेरे पास कोई डेटामेम्बर घोषित नहीं होता है: -x तो - यहाँ क्या चल रहा है? मैं क्या खो रहा हूँ?

संदर्भ के लिए, इस प्रकार मैंने इसे क्रमबद्ध किया है, VDB_SessionController रूट है: *

    public void GemKonfig(VDB_SessionController session)
    {
        var settings = new XmlWriterSettings()
        {
            Indent = true,
            IndentChars = "\t"
        };

        var writer = XmlWriter.Create(defaultFile, settings);
        DataContractSerializer ser =
            new DataContractSerializer(typeof(VDB_SessionController));

        ser.WriteObject(writer, session);
        writer.Close();
    }

आप भविष्य में परिवर्तनों के लिए अपने कोड को अधिक प्रतिरोधी बनाने के लिए [KnownType] और प्रतिबिंब भी जोड़ सकते हैं।

[DataContract]
[KnownType("GetKnownPersonTypes")]
internal class Person
{
    private static IEnumerable<Type> _personTypes;

    private static IEnumerable<Type> GetKnownTypes()
    {
        if (_personTypes == null)
            _personTypes = Assembly.GetExecutingAssembly()
                                    .GetTypes()
                                    .Where(t => typeof (Person).IsAssignableFrom(t))
                                    .ToList();
        return _personTypes;
    }
}

अब DataContractSerializer / DataContractJsonSerializer / XmlSerializer Person साथ काम करने के लिए कॉन्फ़िगर किया गया है, जो Person से व्युत्पन्न किसी भी प्रकार के साथ काम करेगा (जब तक इसे उसी असेंबली में घोषित किया जाता है)।


यह @Leon जैसा है, लेकिन @ ब्रायन से ठीक होने के साथ, 'KnownTypeAttribute' बेस क्लास पर होना चाहिए, इसलिए यह इस तरह होना चाहिए:

[DataContract(Name="DataFelt")]
[KnownType(typeof(somenamespace.Konstant))]
public class DataFelt

और सबक्लास में:

[DataContract(Name="Konstant")]
public class Konstant : DataFelt

मेरे लिए समस्या यह थी कि मैं अपने वेबएपीआई नियंत्रक से इंटरफेस (द्वितीय व्यक्ति) लौट रहा था। जब मैंने उस वापसी प्रकार को कक्षा (व्यक्तिगत) प्रकार में बदल दिया, तो यह त्रुटि चली गई।

काम नहीं कर रहा:

    [HttpGet]
    [Route("api/v1/Individual/Get/{id}")]
    public IIndividual Get([FromUri]int id)
    {
        return _individualService.Get(id);
    }

काम कर रहे:

    [HttpGet]
    [Route("api/v1/Individual/Get/{id}")]
    public Individual Get([FromUri]int id)
    {
        IIndividual individual = _individualService.Get(id);
        return individual as Individual;
    }

इसे WebApiConfig.cs में जोड़ें

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;

var json = config.Formatters.JsonFormatter;

json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
config.Formatters.Remove(config.Formatters.XmlFormatter);

संदर्भ: http://www.datazx.cn/Forums/en-US/a5adf07b-e622-4a12-872d-40c753417645/action?threadDisplayName=web-api-error-the-objectcontent1-type-failed-to-serialize-the-response-body-for-content&forum=wcf






datacontractserializer