2016-08-03 6 views
2

のは私がJSONにシリアライズしたい、このようなクラスのインスタンスがあるとしましょう:使用してJSONの直列化復元時にacessor設定

public class MyClass 
{ 
    public MyClass() { } 

    private List<string> texts; 
    public List<string> Texts 
    { 
     get 
     { 
      return new List<string> { "You got me!" }; 
     } 
     set 
     { 
      texts = value; 
      Console.WriteLine("Setting property!"); 
     } 
    } 
} 

は、私が「テキスト」のために必ずsetアクセサを作ることにしたいと呼ばれているがつまり、MyClassのプライベートプロパティ "text"が設定されていることを確認します。しかし、私は小さなテストケース実行する場合:

public void TestMyClass() 
{ 
    var myClass = new MyClass(); 
    var jsonBefore = JsonConvert.SerializeObject(myClass); 
    var jsonAfter = JsonConvert.DeserializeObject<MyClass>(jsonBefore); 
} 

をsetメソッドが呼び出され、すなわち民間の「テキスト」を取得することはありません逆シリアル化後nullです。デシリアライズ時にpublic "Texts"の中の設定されたアクセサが呼び出されるようにするにはどうすればよいですか?

答えて

1

最初の理由は、.net 1に組み込まれているものとはかなり異なるnewtonsoft jsonシリアライザを使用しているからです。

var json = new JavaScriptSerializer().Serialize(myClass); 
var obj = new JavaScriptSerializer().Deserialize<MyClass>(json); 

このコードは正常に動作します。

第二の理由は、あなたのgetプロパティであり、それはnewtonsoftのJSONシリアライザで処理されていますどのように、あなたが作成するデフォルトのリスト(それが今作っなどとしてコンストラクタにそれを置く方が良いですどんな意味がありません)

を持っています

あなたはまだあなたがTextsプロパティにnullを設定しない場合、あなたはにデフォルト値を設定することができます

var jsonBefore = JsonConvert.SerializeObject(myClass); 
var jsonAfter = JsonConvert.DeserializeObject<MyClass>(jsonBefore, new JsonSerializerSettings 
{ 
    ObjectCreationHandling = ObjectCreationHandling.Replace 
}); 
1

、オブジェクトの作成をカスタマイズするための設定JsonSerializerSettings.ObjectCreationHandlingを使用し、それが今で実施されるような、あなたのGETを使用したい場合それ。

private List<string> texts = new List<string>(){ "Default Value" }; Likeして代わりの

get 
{ 
    return new List<string> { "You got me!" }; 
} 

あなたは

get 
{ 
    return texts; 
} 
+0

これを試してみてください、うまくいく! –

1

シリアライズが、それはだ我々の場合には(保存できる形式にデータ構造やオブジェクトの状態を変換するプロセスです使用する必要がありますjson)。

オブジェクト状態はフィールド値で構成され、すべてのメソッドまたはその他の動作ロジックは単純に無視されます。

プロパティは基本的にバッキングフィールドで動作するメソッドであり、オブジェクトの状態を表さないためシリアル化/逆シリアル化では使用されません。

フィールドtextsは、リフレクションを使用してシリアル化されています。それから、それは直接的に直列化解除され、シリアライザはプロパティが存在することさえも知らない可能性があります。

関連する問題