2017-11-04 144 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 *声明,当然可能会发生无限递归。 –