C# 如何使用JSON.NET序列化静态或常量成员变量?

C# 如何使用JSON.NET序列化静态或常量成员变量?,c#,.net,json.net,C#,.net,Json.net,我在任何地方都找不到这个问题的答案,但当我尝试用静态或常量成员变量序列化结构或类时,默认情况下它们不会序列化。如果我试图通过设置MemberSerialization.OptIn强制序列化,则会出现错误 前 如果我尝试使用以下命令序列化此类: Test t = new Test(); string s = JsonConvert.SerializeObject( t ); 我从'Test'上的'y'获取值时出错错误。。如果y是常量,也会发生同样的情况 我的理论是,静态值和常量值存储在内存中的某

我在任何地方都找不到这个问题的答案,但当我尝试用静态或常量成员变量序列化结构或类时,默认情况下它们不会序列化。如果我试图通过设置
MemberSerialization.OptIn
强制序列化,则会出现错误

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

Test t = new Test();
string s = JsonConvert.SerializeObject( t );
我从'Test'上的'y'获取值时出错
错误。
。如果y是常量,也会发生同样的情况


我的理论是,静态值和常量值存储在内存中的某个特殊位置,出于某种原因,Json序列化程序在尝试访问它们时死亡。这完全是一种预感,但我看不出有任何帮助。我对C#比较陌生,这确实是一个好奇的问题,在这一点上比任何问题都重要。

如果它愿意,它当然可以序列化静态变量。序列化是通过使用反射API检查对象和类型来完成的,这些API允许您“做任何事情”——并没有技术原因使这些值无法序列化

然而,在默认情况下不支持这一点有一个合乎逻辑的原因:它没有多大意义。您正在序列化实例,并且
静态
常量
成员在逻辑上不是实例的一部分,而是整个类的一部分

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

[JsonProperty]
public static int y { get; set; } // this will be serialized

当然,您可以通过创建自定义的
JsonConverter

完全覆盖序列化程序的行为。如果您需要在每个实例上序列化静态成员(或常量),可以使用私有实例级访问器作为解决方法:

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

    // static member we want serialized with each instance
    public static int y = 2;

    // private accessor to allow Json.net to serialize the static member
    [JsonProperty("y")]
    private int y1 { get { return y; } }
}
如果您还需要反序列化到此类,此方法将防止Json.Net覆盖静态成员,同时仍允许您自己的代码在需要时对其进行修改。

尝试以下方法:

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);
}
我这样做是为了将所有静态类常量序列化为一个JS文件,然后将该文件捆绑到angular应用程序中。将生成的js对象附加到$rootScope,所有角度代码都可以访问常量


从Json.NET 6.0.4开始,静态和常量成员变量以及静态属性将在标记为时序列化。从:

  • 修复-修复序列化静态字段
从而序列化以下类:

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

    [JsonProperty]
    static int y = 2;

    [JsonProperty]
    const int z = 333;
}

产生
{“x”:1,“y”:2,“z”:333}
。示例。

它与某些内存无关。如果将序列化看作是类实例的快照,静态变量不是实例的一部分。我无法想象为什么任何人都需要将静态和甚至更少的const序列化为JSON对象的一部分。与康斯特,这是特别有趣的。。。如何反序列化为常量?除了反序列化回同一类型(例如,在javascript中使用序列化的C#对象)之外,还可以将JSON序列化为其他用例。因此,如果它是您感兴趣的数据的一部分,而该类本身在您使用json@Stilgar那你就没什么想象力了,我的朋友。JSON被发送到我们的服务器。服务器用python和javascript处理数据。静态值是一个版本标识符,它告诉服务器这是什么客户端版本,因此它可能会以不同的方式对待不同的客户端。这应该是静态数据。我使用了
readonly
并初始化了类定义中的变量,使其成为实例数据,但实际上,版本说明符应该是静态的。这个问题也说序列化不是反序列化。我想这是一个愚蠢的问题,因为我也不能使用
t.y
…访问y值。。。哦,好吧。有时候需要问一些愚蠢的问题……谢谢。起初,我感到惊讶,与其说默认设置是将static和const成员排除在外,不如说是因为我试图强制它们加入时出现了运行时错误。很高兴知道静态属性可以序列化。
[JsonObject(MemberSerialization.OptIn)]
public class Test
{    
    [JsonProperty]
    int x = 1;

    [JsonProperty]
    static int y = 2;

    [JsonProperty]
    const int z = 333;
}