为什么JSON .Net不能序列化静态或const成员变量?

wal*_*cer 14 .net c# json.net

我无法在任何地方找到答案,但是当我尝试使用static或const成员变量序列化结构或类时,默认情况下它们不会序列化.如果我尝试通过设置强制序列化MemberSerialization.OptIn,我会收到错误.

恩.

[JsonObject(MemberSerialization.OptIn)]
public class Test
{    
    [JsonProperty]
    public int x = 1;

    [JsonProperty]
    public static int y = 2;
}
Run Code Online (Sandbox Code Playgroud)

如果我尝试使用以下命令序列化此类:

Test t = new Test();
string s = JsonConvert.SerializeObject( t );
Run Code Online (Sandbox Code Playgroud)

我收到了错误Error getting value from 'y' on 'Test'.如果y是const,则会发生同样的情况.

我的理论是静态和const值存储在特殊的内存中,并且由于某种原因,Json序列化器试图访问它们.这完全是一种预感,我在C#Reference for Static中看不到任何帮助.我对C#比较陌生 - 在这一点上,这真的是一个好奇的问题.

Jon*_*Jon 19

如果愿意,它当然可以序列化静态变量.通过使用Reflection API检查对象和类型来完成序列化,这些API允许您执行"任何操作" - 没有技术原因这些值无法序列化.

然而,有一个逻辑上的理由不支持默认情况:它没有多大意义.您正在序列化一个实例,static或者const成员在逻辑上不是实例的一部分,而是整个类的一部分.

也就是说,static如果它是属性,你仍然可以序列化成员:

[JsonProperty]
public static int y { get; set; } // this will be serialized
Run Code Online (Sandbox Code Playgroud)

当然,您可以通过创建自定义来完全覆盖序列化程序的行为JsonConverter.


dbc*_*dbc 8

从Json.NET 6.0.4开始,静态和const成员变量以及静态属性在标记时将被序列化[JsonProperty].从发行说明:

  • 修复 - 修复了序列化静态字段

因此序列化以下类:

[JsonObject(MemberSerialization.OptIn)]
public class Test
{    
    [JsonProperty]
    int x = 1;

    [JsonProperty]
    static int y = 2;

    [JsonProperty]
    const int z = 333;
}
Run Code Online (Sandbox Code Playgroud)

生产{"x":1,"y":2,"z":333}.示例小提琴.


小智 6

尝试这个:

using Newtonsoft.Json;
using System.Collections.Generic;
using System.Linq;

public static string SerializeStaticClass(System.Type a_Type)
{
        var TypeBlob = a_Type.GetFields().ToDictionary(x => x.Name, x => x.GetValue(null));
        return JsonConvert.SerializeObject(TypeBlob);
}
Run Code Online (Sandbox Code Playgroud)

我这样做是为了将所有静态类常量序列化到一个 JS 文件中,然后将该文件捆绑到一个 Angular 应用程序中。您将生成的 js 对象附加到 $rootScope,并且所有 Angular 代码都可以访问常量。

帽子提示在这里