如何使用JSONCONVERT序列化类的静态变量,该变量由C#中的类本身实例初始化

时间:2017-11-04 00:55:11

标签: c# json serialization json.net json-deserialization

我的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]的参数。它确实成功反序列化,但在反序列化的类中丢失了名称和值。

你能帮我解决一下,如何序列化这样的类实例?

1 个答案:

答案 0 :(得分: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;
}