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;
}