मेरे पास एक कक्षा है जिसमें डायनामिक ऑब्जेक्ट्स की एक सूची है। मेरे पास एक यूनिट टेस्ट है जो पुष्टि करता है कि न्यूटॉन्सॉफ्ट जेसन सीरिएलाइज़र/डेसेरियलइज़र इसे सही तरीके से संभालता है। हालांकि, डिफ़ॉल्ट ओडाटा जेसन सीरिएलाइज़र/Deserializer नहीं है। साथ यह DefaultODataDeserializerProvider है साथमैं न्यूटन सॉफ़्ट के जेसन सीरिएलाइज़र के साथ ओडाटा वी 4 डिफ़ॉल्ट जेसन सीरिएलाइज़र को कैसे बदलूं?
public class JsonODataEdmTypeDeserializer : ODataEdmTypeDeserializer
{
public JsonODataEdmTypeDeserializer(ODataPayloadKind payloadKind) : base(payloadKind)
{
}
public JsonODataEdmTypeDeserializer(ODataPayloadKind payloadKind, ODataDeserializerProvider deserializerProvider) : base(payloadKind, deserializerProvider)
{
}
public override object Read(ODataMessageReader messageReader, Type type, ODataDeserializerContext readContext)
{
var data = readContext.Request.Content.ReadAsStringAsync().Result;
//Call to the NewtonSoft Deserializer
var ret = JsonConvert.DeserializeObject(data, type);
return ret;
}
}
:
मैं इस तरह अपने ही ODataEdmTypeDeserializer कार्यान्वित
public class JsonODataDeserializerProvider : DefaultODataDeserializerProvider
{
public override ODataEdmTypeDeserializer GetEdmTypeDeserializer(IEdmTypeReference edmType)
{
var kind = GetODataPayloadKind(edmType);
return new JsonODataEdmTypeDeserializer(kind, this);
}
private static ODataPayloadKind GetODataPayloadKind(IEdmTypeReference edmType)
{
switch (edmType.TypeKind())
{
case EdmTypeKind.Entity:
return ODataPayloadKind.Entry;
case EdmTypeKind.Primitive:
case EdmTypeKind.Complex:
return ODataPayloadKind.Property;
case EdmTypeKind.Collection:
IEdmCollectionTypeReference collectionType = edmType.AsCollection();
return collectionType.ElementType().IsEntity() ? ODataPayloadKind.Feed : ODataPayloadKind.Collection;
default:
return ODataPayloadKind.Entry;
}
}
}
ये काम सही ढंग से, लेकिन जब मैं अपने खुद के क्रमानुसार कार्यान्वयन बनाने की कोशिश की मैं एक अवरोध में भाग :
public class JsonODataEntityTypeSerializer : ODataEntityTypeSerializer
{
public JsonODataEntityTypeSerializer(ODataSerializerProvider serializerProvider)
: base(serializerProvider)
{
}
public override void WriteObject(object graph, Type type, ODataMessageWriter messageWriter, ODataSerializerContext writeContext)
{
}
WriteObject gets जब मेरा नियंत्रक ऑब्जेक्ट को प्रश्न में वापस करने का प्रयास करता है, लेकिन मुझे यकीन नहीं है कि न्यूटॉन्सॉफ्ट सीरियलाइज़र डालने के लिए यहां क्या करना है। मैंने ओडाटा स्रोत कोड डाउनलोड किया और इसके माध्यम से देखा लेकिन मुझे हुक की जरूरत नहीं है।
मैं के रूप में। के अंतर्गत इसे खड़े करो, json.net डिफ़ॉल्ट धारावाहिक है - http://stackoverflow.com/questions/20371040/am-i-using-datacontractjsonserializer-or-the-json-net-one-in-my-web-api-2 –
@snow_FFFFFF Json.Net वेब एपीआई के लिए डिफ़ॉल्ट धारावाहिक है, लेकिन ओडाटा (आश्चर्यजनक रूप से) के लिए नहीं। ओडाटा का अपना आंतरिक धारावाहिक है। –