2010-12-30 5 views
42

Der DataContractJsonSerializer kann Wörterbücher nicht ordnungsgemäß serialisieren.Kann DataContractJsonSerializer Wörterbücher richtig serialisieren?

Während JavaScriptSerializer Wörterbücher als {"abc":"xyz","def":42} zum Beispiel serialisiert, die DataContractJsonSerializer [{"Key":"abc","Value":"xyz"},{"Key":"def","Value":42}] stattdessen gibt.

Das ist wirklich problematisch und ich möchte wissen, wie ich Dictionary-Objekte korrekt in meinem WCF-Dienst serialisieren kann. Ich suche nach einer Lösung, die möglichst wenig Aufwand erfordert.

ref: http://msdn.microsoft.com/en-us/library/bb412170.aspx

Dies ist die Abhilfe, die ich schließlich verwendet, um Wörterbücher richtig in WCF serilize: http://social.msdn.microsoft.com/forums/en-US/wcf/thread/765f1569-0422-4471-8ec2-1d03b2026771

+1

Wenn Sie nicht Json.NET verwenden, finden Sie dies: http://stackoverflow.com/questions/7498208/serialize-dictionarytkey-tvalue-zu-json-mit-datencontractjsonserializer – mehmettkocc

Antwort

43

Mit DataContractJsonSerializerSettings (verfügbar seit .NET 4.5) kann dies für Sie tun:

var serializer = new DataContractJsonSerializer(typeOfObj, new DataContractJsonSerializerSettings() 
{ 
    UseSimpleDictionaryFormat = true 
}); 
+0

Hallo, wo kann ich den "normalen" Serializer mit diesem Serializierer ersetzen, wenn ich den Service-Host im Code anlege? – flayn

8

Obwohl dies in den meisten Fällen verursachen eine große Rewrite und somit nicht möglich sein, das Sie Ihre WCF-Service-Schnittstelle übernehmen und das Rück Stream in diesem Fall lassen Sie die volle Kontrolle über die Serialisierung nehmen. Auf diese Weise können Sie JavaScriptSerializer, JSON.NET oder ServiceStack.JSON verwenden, um die eigentliche Serialisierung durchzuführen, und diese Serialisierer befassen sich tatsächlich mit einem Wörterbuch auf eine vernünftigere Weise.

+0

Haben Sie vielleicht String statt Stream gemeint? –

+3

@Markus: Nein, habe ich nicht. Ein String gibt Ihnen keine Kontrolle über die Serialisierung, er gibt der Methode eine Signatur, die irgendeine Art von Eingabe erzwingt, während "Stream" per Konvention WCF anweist, dass Sie die Kontrolle über die Serialisierung übernehmen wollen. Ich denke nicht, dass diese beiden Lösungen austauschbar sind. – faester

+0

Hmm ... Ich nahm an, dass ein Rückgabetyp der Zeichenfolge auch nicht verarbeitet werden würde, was nicht der Fall zu sein scheint? Sonst wäre die Verwendung von Stream anstelle von String unhandlich, IMO. –

3

DataContractJsonSerializerSettings hat jetzt die Eigenschaft UseSimpleDictionaryFormat und serialisiert Wörterbücher so, wie Sie es erwarten.

+1

Wo kann ich den "normalen" Serializer durch diesen Serializierer ersetzen, wenn ich den Service-Host im Code erstelle? – flayn

Verwandte Themen