2016-06-14 13 views
2

Ich habe ein sehr seltsames Problem in Bezug auf Serializer von ServiceStack.Text.ServiceStack Serialize und Deserialize Dictionary mit Objekten

Angenommen, ich habe zwei Klassen, eine Person und eine andere Address genannt.

Person:

public class Person 
{ 
    public string Name { get; set; } 
    public Dictionary<string,object> ExtraParams { get; set; } 
} 

Adresse:

public class Address 
{ 
    public string StreetName { get; set; } 
} 

In einer der Methoden, die ich tun dies

var john = new Person 
     { 
      Name: "John", 
      ExtraParameters: new Dictionary<string, object> 
      { 
       { "AddressList", new List<Address>{ 
        new Address{ StreetName : "Avenue 1" } 
        } 
       } 
      } 
     }; 

ich ServiceStack des ORMLite zu verwende. Nun ist die Probleme kommen, wenn ich versuche, die Daten aus der Datenbank abrufen und zurück zum Wörterbuch werfen:

//save to database 
var id = db.Save(john) 

//retrieve it back 
var retrieved = db.SingleById<Person>(id); 

//try to access the Address List 
var name = retrieved.Name; //this gives "John" 
var address = retrieved.ExtraParameters["AddressList"] as List<Address>; //gives null always , due to typecasting failed. 

Wenn ich versuche, zu debuggen, die ExtraParameters ist ein Dictionary, mit key Namen „Address“, aber die value ist eigentlich eine string - "[{StreetName:"Avenue 1"}]"

Irgendwelche Ideen wo habe ich falsch gemacht? Ich habe SO auf und ab über Typecasting auf die Objekte und Wörterbücher gesehen, aber keiner von ihnen schien das gleiche Problem zu haben wie ich.

ich folgende Konfigurationen eingestellt haben:

JsConfig.ExcludeTypeInfo = true; 
JsConfig.ConvertObjectTypesIntoStringDictionary = true; 
+0

versuchen, 'AddressList' als' List

'mit dem' Type Serializer' zu deserialisieren. –

Antwort

1

Während das, was Demiz gesagt hat, wahr ist - dass die Vererbung in DTO schlecht ist, würde ich wirklich eine genauere Antwort für die Frage posten wollen, für den Fall, dass jemand es wirklich braucht.

Legen Sie die folgenden Flags:

JsConfig.ExcludeTypeInfo = false; //this is false by default 
JsConfig.ConvertObjectTypesIntoStringDictionary = true; //must set this to true 

Für Liste der objects, die serialisiert werden passiert, müssten Sie es als eine Liste von Objekten ersten deserialisieren und jeder von ihm wieder auf die ursprüngliche Klasse werfen:

//save to database 
var id = db.Save(john); 

//retrieve it back 
var retrieved = db.SingleById<Person>(id); 

//try to access the Address List 
var name = retrieved.Name; //this gives "John" 
//cast it to list of objects first 
var tempList = retrieved.ExtraParameters["AddressList"] as List<object>; 
//cast each of the objects back to their original class; 
var address = tempList.Select(x=> x as Address); 

Hoffe dieser hilft wer auch immer es in der Zukunft braucht.

2

Zum einen object Speicherung ist ein bad idea for serialization und ich würde mit dringend vermeiden.

Weiter sind Sie Serialisierung von object brechen, wenn Sie folgendes einstellen:

JsConfig.ExcludeTypeInfo = true; 

ServiceStack nur die Info-Art hinzufügt, wenn sie sie braucht, und diese Konfiguration verhindert, dass der Typ Info im JSON Nutzlast von Serialisierung, das ist die einzige Sache, die ServiceStack mitteilt, wie sie es wieder entserialisiert, weil Sie einen spät gebundenen objects Typ verwenden, wo ServiceStack nicht wissen kann, was der Typ sonst ist.

+0

Ja, Sie sind richtig @mythz. Ich muss die 'JsConfig.ExcludeTypeInfo' auf false setzen (was standardmäßig ist). – CozyAzure

+0

@CozyAzure Sie müssen es nur nicht einstellen, d. H. Entfernen Sie die Konfiguration an erster Stelle. – mythz

+0

yeap, lies die docs und erfuhr das. – CozyAzure

Verwandte Themen