2017-08-06 29 views
0

我需要序列化深層嵌套的RealmObject到JSON以發佈到Web API,使用Xamarin和C#。如何在Realm中爲Xamarin序列化RealmObject到JSON?

原因是因爲我不希望RealmObject屬性繼續存在,所以實際上我正在尋找可以序列化爲JSON的POCO表示形式。我無法在Realm中找到任何Xamarin的輔助方法來做到這一點,所以我猜我需要推出自己的方法。

我正在考慮一些選擇,並希望一些反饋:

  1. 使用JSON.NET定製ContractResolver。
  2. 在RealmObject上包含一個ToObject方法,該方法返回一個動態類型,然後我可以使用JsonConvert.SerializeObject序列化
  3. 使用JsonTextWriter遍歷對象並手動創建相應的json。

目前我在看選項2,因爲它非常直接,例如,

public class Person:RealmObject { 
    public string FirstName {get;set;} 
    public string LastName {get;set;} 
    public IList<Dog> Dogs {get;set;} 

    public dynamic ToObject(){ 
     return new {FirstName,LastName, Dogs = Dogs.Select(x => x.ToObject())}; 
    } 
} 

public class Dog { 
    public string Name; 

    public dynamic ToObject(){ 
     return new {Name}; 
    } 
} 

var person = new Person(){...} 
var json = JsonConvert.SerializeObject(person.ToObject()); 
var content = new StringContent(json); 
var response = await client.PostAsync(url, content); 

有什麼想法?

+1

既然你已經使用Json.NET,我認爲你可以使用* [如何防止使用Newtonsoft JSON在DependencyObjects上對DependencyObjectType信息進行序列化](https://stackoverflow.com/q/35326836/3744182)*中的任何一個答案來抑制' RealmObject'或序列化派生類型時的基本類型。 – dbc

+0

特別是'IgnoreTypePropertiesContractResolver '從[這裏](https://stackoverflow.com/a/35328265/3744182)似乎應該做你需要的自動。 – dbc

回答

3

如果你不介意的應用幾個屬性,更清潔的(在我心中)解決方案是使用JsonObject屬性與MemberSerialization.OptIn說法:

[JsonObject(MemberSerialization.OptIn)] // Only properties marked [JsonProperty] will be serialized 
public class Person : RealmObject 
{ 
    [JsonProperty] 
    public string FirstName { get; set; } 

    [JsonProperty] 
    public string LastName { get; set; } 

    [JsonProperty] 
    public IList<Dog> Dogs { get; set; } 
} 
+0

感謝您的閱讀 - 我已閱讀文檔,但錯過了這一點。好多了! –