2016-04-07 5 views
1

シリアル化の通常の方法は、クラスに属性を適用してシリアル化(または逆シリアル化)をどのように進めるかを記述することです。たとえば:JSON.NETは「サイドカー」アプローチを使用してオブジェクトをシリアライズできますか?

[DataContract] 
class MyClass 
{ 
    [DataMember] 
    public string Name { get; set; } 
} 

は、あなたのクラスに属性を適用せずにJSON.NETを使用して直列化を実行するための方法ですが、代わりにシリアライズされるクラスのどのような側面を説明し、「サイドカー」オブジェクトを提供することにより、中いくつかのファッション。

私が尋ねる理由は懸念の分離に関する。要求がどのように到達するかに無関心であるAPIを使用している場合、その自然な拡張は、APIデータ構造が直列化属性で補完されるべきではないということです。

私のAPI結果オブジェクトの1つの "コンテンツ"を取得して、それをに持つクラスを持つ別のオブジェクトにコピーすることはできますが、場合によっては、 "ねえ、私はこのオブジェクトをシリアル化したい、オブジェクトにはシリアル化属性がないので、ここでは何をすべきかを記述する別のデータ構造があります。

これは便利な場所ですが、もちろん、オブジェクトを変更する機会がないサードパーティ製のライブラリもあります(この場合も、値のコピーを作成できますが、私は他の方法を探しています)。

+1

「sidercar」オブジェクトは、[DTO(http://stackoverflow.com/q/725348/1997232)です。データを直接シリアル化したくない場合は、DTOを使用してデータをシリアル化できます。他のものは、それ自身の[属性](http://www.newtonsoft.com/json/help/html/serializationattributes.htm)でjsonのシリアル化を制御できるものです。オプトインモードを設定し、シリアル化するフィールド/プロパティのみをマークします。彼らは「プライベート」でさえあり得る。 – Sinatr

答えて

3

JsonSerializerSettingsを使用して、さまざまなシリアル化オプションを指定できます。あなたは、その値を特定の型をシリアル化または変換する方法、whether to serialize or not a particular propertyを指定することができる、等

 var settings = new JsonSerializerSettings 
      { 
       Formatting = Formatting.Indented, 
       ..... 
      }; 
    settings.Converters.Add(new StringEnumConverter { CamelCaseText = true }); 
    settings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 
    settings.Binder = new SomeSerializationBinder(new DefaultSerializationBinder()); 

    var result = JsonConvert.SerializeObject(yourObject, settings); 
関連する問題