【问题标题】:Why do class fields get defaulted at deserialization?为什么类字段在反序列化时会被默认?
【发布时间】:2019-02-17 20:11:21
【问题描述】:

您好,我有一个在.Net Standard 程序集中定义的类。 现在我从我的.Net Core 项目中引用了该程序集。

当我尝试反序列化 .Net Core 中的类时,我的类字段是默认的。

默认情况下,我的意思是值类型获取所有内部值默认值,并且类字段为空。 在我的示例中,如果Valint,反序列化后它的值将是0,而如果它是class,它将为空。

.NET Standard

public  class Matrix
{
    public int Val { get; set; }


    public Matrix(int set) //value is default
    {
        this.Val = set;
    }
}

.NET Core

static void Main(string[] args)
{

    Matrix matr = new Matrix(3);


    var str=JsonConvert.SerializeObject(matr);
    var bytes=Encoding.Utf8.GetBytes(str);


    var str = Encoding.UTF8.GetString(bytes); //string looks ok !


    var deser = JsonConvert.DeserializeObject<Matrix>(str);

}

请注意,我的类在构造函数中使用了一个参数。这可能是问题吗?如果我的参数构造函数确实是问题......你如何设法通过他的参数序列化一个需要在其构造函数中执行一些逻辑的对象?

【问题讨论】:

  • 这段代码有几个无效和编译时间问题。例如,DeserializeObject 接受一个字符串。为了确保其他人可以复制您的问题,您可以从您的编辑器/IDE 中粘贴确切的内容吗?如果您需要更改某些内容以隐藏内容,请确保您的简化代码能够编译并复制问题。
  • 你说我的类字段是默认的是什么意思?你的意思是Assert(deser.Val == matr.Val); 会失败,因为deser.Val(实际上是一个属性,而不是一个字段)在反序列化后为零?还是你的意思是别的?一个 minimal reproducible example 包括一个失败但应该成功的 Assert 语句将是理想的,并且最大限度地提高我们可以帮助您的机会。
  • 对不起,这是一个错字。我编辑了我的帖子。

标签: .net-core json.net deserialization


【解决方案1】:

您提供的代码效果很好。在deser.Val 中反序列化后,您将看到 3。但如果您更改public int Val { get; private set; }public int Val { get; },您将获得一个默认值。对于引用类型,对于它所依赖的值类型,它将为 NULL。

能否提供更多信息和问题截图?

【讨论】:

    猜你喜欢
    • 2015-03-02
    • 2018-08-20
    • 2011-05-23
    • 1970-01-01
    • 2013-03-05
    • 2021-10-27
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多