如何序列化使用JSONCONVERT这是由类本身的实例,在C#中初始化类的静态变量
我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]
参数。它确实反序列化,但名称和值在反序列化的类中丢失。
能否请你帮我,如何序列化这样的类实例?
的问题是,你的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;
}
静态成员被共享和初始化***只是一次***,所以在这里不会有任何不定式的递归。 –
@KingKing,请注意,我并不是说在初始化时存在无限递归,我的意思是它在使用类的实例时有潜力。如果您实例化一个类,请使用您的调试器来检查该对象。看着'Instance1',然后检查它的'Instance1'变量,以及下一个,到无穷大。潜在的麻烦是如果你有递归访问这些字段的代码,那么你最终会发生堆栈溢出。我会修改我的答案来澄清这一点。 – Nik
如果这个成员是***静态的,那就完全没问题了 - 这是一个重要的观点,如果他错过了* static *声明,当然可能会发生无限递归。 –
在另一方面,是什么让从创建初始化对象的一个无限循环的例子吗? –
价值观没有序列化的原因是因为他们不是***公共财产***,为什么你要隐藏它们?只要将它们暴露为公共财产,你就会很好。你也可以在私有成员上使用'JsonPropertyAttribute'来允许序列化。 –
尝试在不调用静态成员的情况下创建该类的实例,您将无法做到这一点。如果你不能,那么解串器无法做到这一点。 – CodingYoshi