2017-11-04 177 views
2

C#類具有以下結構如何序列化使用JSONCONVERT這是由類本身的實例,在C#中初始化類的靜態變量

public class Example 
{ 
    public static Example Instance1 = new Example (0, "A"); 
    public static Example Instance2 = new Example (1, "B"); 
    protected Example(int value, string name) 
    { 
     this.value = value; 
     this.name = name; 
    } 
    private int value; 
    private string name; 
} 

現在我試圖序列Example.Instance1如下

var serializedVariable = JsonConvert.SerializeObject(Example.Instance1); 

var OriginalVariable = JsonConvert.DeserializeObject<Example>(serializedVariable); 

但它引發了一個異常,它沒有爲JSON指定構造函數,但在反序列化版本中值和名稱都會丟失。

現在我增加了一個用於構造稱爲[JsonConstructor]參數。它確實反序列化,但名稱和值在反序列化的類中丟失。

能否請你幫我,如何序列化這樣的類實例?

+0

在另一方面,是什麼讓從創建初始化對象的一個​​無限循環的例子嗎? –

+2

價值觀沒有序列化的原因是因爲他們不是***公共財產***,爲什麼你要隱藏它們?只要將它們暴露爲公共財產,你就會很好。你也可以在私有成員上使用'JsonPropertyAttribute'來允許序列化。 –

+0

嘗試在不調用靜態成員的情況下創建該類的實例,您將無法做到這一點。如果你不能,那麼解串器無法做到這一點。 – CodingYoshi

回答

1

的問題是,你的Example類沒有默認構造函數。當你定義的類定義構造函數,編譯器會爲您提供一個隱含
see this answer);然而,如果確實定義了一個重載的構造函數(與您一樣),編譯器將不再爲您提供默認的構造函數。

爲了反序列化和實例化一個類的實例(這是所有通過反射做),你的類必須有一個默認的構造函數。 See this question

下面的代碼現在應該按預期工作:

public class Example 
{ 
    public static Example Instance1 = new Example (0, "A"); 
    public static Example Instance2 = new Example (1, "B"); 
    //Must have this default constructor! 
    protected Example() 
    {//... Add code if needed 
    } 
    protected Example(int value, string name) 
    { 
     this.value = value; 
     this.name = name; 
    } 
    private int value; 
    private string name; 
} 
+0

靜態成員被共享和初始化***只是一次***,所以在這裏不會有任何不定式的遞歸。 –

+0

@KingKing,請注意,我並不是說在初始化時存在無限遞歸,我的意思是它在使用類的實例時有潛力。如果您實例化一個類,請使用您的調試器來檢查該對象。看着'Instance1',然後檢查它的'Instance1'變量,以及下一個,到無窮大。潛在的麻煩是如果你有遞歸訪問這些字段的代碼,那麼你最終會發生堆棧溢出。我會修改我的答案來澄清這一點。 – Nik

+0

如果這個成員是***靜態的,那就完全沒問題了 - 這是一個重要的觀點,如果他錯過了* static *聲明,當然可能會發生無限遞歸。 –