2016-06-14 7 views
2

ここでは、ServiceStack.Textのシリアライザに関する非常に奇妙な問題があります。ServiceStackオブジェクトを使用して辞書のシリアライズとデシリアライズ

私は2つのクラス、1つはPersonと呼ばれ、もう1つはAddressと呼ばれているとします。

パーソン:

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

住所:私はこの

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

を行う方法の一つで

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

私もServiceStackのORMLiteを使用しています。私は、データベースからデータを取得し、辞書に戻ってそれをキャストしようとすると、今の問題が来る:「AddressListを」という名前のkey

//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. 

私はデバッグしようとすると、ExtraParameters は、Dictionaryですが、 valueは実際には文字列です - "[{StreetName:"Avenue 1"}]"

私は間違っていますか?私はオブジェクトと辞書の型キャスティングについてSOを見上げてきましたが、それらのどれも私と同じ問題を抱えていないようでした。私は、次のconfigsを設定している

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

'AddressList'を' Type Serializer'を使って 'List

'として非直列化しようとします。 –

答えて

1

DTOの継承は悪いと言われていますが、本当に誰かが本当に必要な場合に備えて、より正確な答えを投稿したいと思っています。

を設定し、次のフラグ:

シリアル化するたまたま objectsの一覧については
JsConfig.ExcludeTypeInfo = false; //this is false by default 
JsConfig.ConvertObjectTypesIntoStringDictionary = true; //must set this to true 

、あなたが最初のオブジェクトのリストとしてそれをデシリアライズし、元のクラスに戻ってそれを各1をキャストする必要があります:

//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); 

これは将来誰かが必要とすることを願っています。

2

まずobjectを保存するには、bad idea for serializationであると私は強く、それを使用しないようと思います。

次設定したときにobjectのシリアライズを壊している:それはそれを必要とするとき

JsConfig.ExcludeTypeInfo = true; 

ServiceStackは唯一のタイプの情報を追加し、この構成は、JSONペイロード内の型情報をシリアル化するのを防ぎますServiceStackがタイプ以外のものを知ることができない、遅いバインドobjectsタイプを使用しているため、ServiceStackに必要なものを逆シリアル化する唯一のことです。

+0

はい、あなたは@mythzです。 'JsConfig.ExcludeTypeInfo'をfalseに設定する必要があります(これはデフォルトです)。 – CozyAzure

+0

@CozyAzure設定しないと、最初の設定が削除されます。 – mythz

+0

yeap、ドキュメントを読んで、それを見つけました。 – CozyAzure

関連する問題