2015-10-26 6 views
7

मेरे पास एक कक्षा है जिसमें डायनामिक ऑब्जेक्ट्स की एक सूची है। मेरे पास एक यूनिट टेस्ट है जो पुष्टि करता है कि न्यूटॉन्सॉफ्ट जेसन सीरिएलाइज़र/डेसेरियलइज़र इसे सही तरीके से संभालता है। हालांकि, डिफ़ॉल्ट ओडाटा जेसन सीरिएलाइज़र/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 जब मेरा नियंत्रक ऑब्जेक्ट को प्रश्न में वापस करने का प्रयास करता है, लेकिन मुझे यकीन नहीं है कि न्यूटॉन्सॉफ्ट सीरियलाइज़र डालने के लिए यहां क्या करना है। मैंने ओडाटा स्रोत कोड डाउनलोड किया और इसके माध्यम से देखा लेकिन मुझे हुक की जरूरत नहीं है।

+0

मैं के रूप में। के अंतर्गत इसे खड़े करो, json.net डिफ़ॉल्ट धारावाहिक है - http://stackoverflow.com/questions/20371040/am-i-using-datacontractjsonserializer-or-the-json-net-one-in-my-web-api-2 –

+1

@snow_FFFFFF Json.Net वेब एपीआई के लिए डिफ़ॉल्ट धारावाहिक है, लेकिन ओडाटा (आश्चर्यजनक रूप से) के लिए नहीं। ओडाटा का अपना आंतरिक धारावाहिक है। –

उत्तर

1

इससे पहले की तलाश में, मुझे नहीं लगता कि यह संभव है। यह :-(एक एक्सएमएल serializer जोड़ने के लिए संभव नहीं है किंडा तरह

यह उदाहरण NewtonsoftJsonDataWriter के लिए, वेब एपीआई हालांकि

2

आप एक कस्टम DataWriter बनाने के लिए संभव है:। ODataWriter

वहाँ एक नज़र : tutorial-sample-odatalib-custom-payload-format

उदाहरण यह एक सीएसवी लेखक जो कार्यान्वित किया जाता है, मुझे लगता है कि है आप तो एक सरल Json.Convert() के साथ अपने तरीकों WriteStart, WriteHeader, WriteEntry और WriteEnd ओवरराइड करने के लिए सक्षम हो जाएगा में

संबंधित मुद्दे