2014-08-28 22 views
5

yinelenen öğelerle sonuçlanır. Bir winform uygulaması için memento pattern'u uygulamak için json.net kullanıyorum. Başarısız bir veritabanı işleminde bir nesneyi geri almak için memento kullanıyorum. Benim aldığım problem, mementoyu serpiştirirken, getterin setterden ziyade çağrılmasıdır. Bana göstermek edelim: SomeObjects henüz yüklü değilse yukarıdaki örnek sınıfından görebileceğiniz gibiJson.Net, listenin serileştirilmesi sırasında property getter öğesini çağırır, bu da

* MyObject
class MyClass 
{ 
    public int ID { get; set; } 
    public string field1 { get; set; } 
    public string field2 { get; set; } 

    private List<SomeObject> _someObjects; 
    public List<SomeObject> SomeObjects 
    { 
     get 
     { 
      if(_someObjects == null) 
      { 
       _someObjects = LoadSomeObjectsFromDB(); 
      } 
      return _someObjects; 
     } 
     set 
     { 
      _someObjects = value; 
     } 
    } 

    private List<AnotherObject> _anotherObjects; 
    public List<AnotherObject> AnotherObjects 
    { 
     get 
     { 
      if(_anotherObjects == null) 
      { 
       _anotherObjects= LoadAnotherObjectsFromDB(); 
      } 
      return _anotherObjects ; 
     } 
     set 
     { 
      _anotherObjects = value; 
     } 
    } 
} 

, SomeObject ve AnotherObject aynı temel sınıfa, Model

uzatmak, bu kadar Lazy Loading kullanır Veritabanından yükleyin. Şimdi bu nesneyi serileştirdiğimde.

{ 
    "ID": 1, 
    "field1": "field 1", 
    "field2": "field 2", 
    "SomeObjects": [ 
    { 
     "ID": 1, 
    }, 
    { 
     "ID": 2, 
    }, 
    { 
     "ID": 3, 
    } 
    ], 
    "AnotherObjects": [ 
    { 
     "ID": 4, 
    }, 
    { 
     "ID": 5, 
    }, 
    { 
     "ID": 6, 
    } 
    ] 
} 

sonuçlanan

string memento = JsonConvert.SerializeObject(obj); 

sonra, daha sonra bu serisini.

MyObject obj = JsonConvert.DeserializeObject(memento, typeof(MyObject)); 

ben den başlatmak için Listesini neden SomeObjects ve AnotherObjectsList s

SomeObjects gaz giderici içinde

{ 
    "ID": 1, 
    "field1": "field 1", 
    "field2": "field 2", 
    "SomeObjects": [ 
    { 
     "ID": 1, 
    }, 
    { 
     "ID": 2, 
    }, 
    { 
     "ID": 3, 
    }, 
    { 
     "ID": 1, 
    }, 
    { 
     "ID": 2, 
    }, 
    { 
     "ID": 3, 
    } 
    ], 
    "AnotherObjects": [ 
    { 
     "ID": 4, 
    }, 
    { 
     "ID": 5, 
    }, 
    { 
     "ID": 6, 
    }, 
    { 
     "ID": 4, 
    }, 
    { 
     "ID": 5, 
    }, 
    { 
     "ID": 6, 
    } 
    ] 
} 

çok fazla öğe denir aşağıdaki JSON ile temsil nesneyi almak DB sonra serileştirilmiş liste buna eklenir. Listeden istediğimden daha fazla öğe bırakarak. Ama alıcı hala denir Tembel Yükleme bölümünü

public List<SomeObject> SomeObjects 
{ 
    get 
    { 
     /*if(_someObjects == null) 
     { 
      _someObjects = LoadSomeObjectsFromDB(); 
     }*/ 
     return _someObjects; 
    } 
    set 
    { 
     _someObjects = value; 
    } 
} 

kaldırmak, ancak boş dönerse. Daha sonra json.net, value dizgesini, önceden eklenmiş doğru sayıda eleman içeren bir liste olarak çağırır, ancak eğer getter, bir initalized listeyi döndürürse, o zaman hiçbir zaman diziyi çağırmaz. Bir liste zaten başlatılmışsa, tutarsızlık neden alıcıya çağrılır ve buna eklenir. Ancak başlatılmazsa, ayarlayıcı çağrılır ve nesne ile doldurulmuş bir listeyle başlatılır. Json.net'in jenerik bir List serisinin serileştirilmesi sırasında sadece diziyi çağırması için bir yol var mı?

cevap

9

Json.Net bu amaç için bir ObjectCreationHandling ayarına sahiptir. örneğin, Replace bunu belirlemeyi deneyin .:

JsonSerializerSettings settings = new JsonSerializerSettings(); 
settings.ObjectCreationHandling = ObjectCreationHandling.Replace; 

MyObject obj = JsonConvert.DeserializeObject<MyObject>(memento, settings); 

Demo: https://dotnetfiddle.net/rkY1pt

+0

Ah dang, ben aptal hissetmiyorum. –

+0

@AndrewWhitaker Heh, terleme; Eğer ayar hakkında bilmiyorsanız bir dönüştürücü aslında burada kötü bir çözüm değildir. –

+0

Sorunumu düzeltmek için tam olarak ihtiyacım olan şey bu, teşekkürler. –