2010-09-30 20 views
4

我有以下幾點:使用JSON.NET,我該如何序列化這些繼承的成員?

public class MyClass : SuperClass {  
    [JsonProperty] 
    public virtual string Id { get; set; } 
} 

public abstract class SuperClass { 
    public int GetHashCode() { 
    //do things here 
    } 
} 

我不能改變SuperClass。當我去序列化到JSON使用JsonNet我會做這樣的事情:

JsonSerializerSettings serializer = new JsonSerializerSettings { 
     //serializer settings 
    }; 

    var jsonNetResult = new JsonNetResult { 
     Data = myClass, 
     SerializerSettings = serializer 
    }; 

    return jsonNetResult; 

顯然它不會序列GetHashCode()。如果我去:

var jsonNetResult = new JsonNetResult { 
     Data = myClass.GetHashCode(), 
     SerializerSettings = serializer 
    }; 

它將正確序列化的價值,是有一些串行設置,我可以用它來告訴它包括GetHashCode()

編輯:我要補充一點,我現在正在創建一個屬性只有get做到這一點,即

[JsonProperty] 
public virtual int GetHashCodeJson { get { return GetHashCode(); } 

回答

0

這與其說是一個與.net序列與JSON.Net問題一般。

您需要序列化對象的屬性,並要求序列化方法的返回值。所以沒有辦法用你想要的語法來做到這一點。

你能夠做到這一點:

Data = myClass.GetHashCode() 

唯一手段,該方法(一個int)的返回值可以被序列化,而不是該串行關心的所有關於什麼方法值來從。

如果你考慮一下,說一個值是一個方法的序列化返回值沒有什麼意義,因爲如何反序列化呢?您永遠無法將該值寫回該方法,因爲它只是一個返回值,而不是像{get; set;}屬性那樣的雙向關係。

+0

那麼圍繞它的一個方法是有一個沒有get和沒有設置的屬性,引用方法,它工作正常。有沒有比這更好的處理方法?然後你得到複雜的屬性,如GetHashCodeJson {get {return GetHashCode(); }} – 2010-10-13 21:21:08

+0

我同意這個名字不太好。在你的情況下,如果你想這樣做,它可能只是HashCode而不是GetHashCodeJson,但問題依然存在,你需要一個與方法不同的屬性名稱。 – 2010-10-14 03:14:44