【发布时间】:2014-06-20 22:32:27
【问题描述】:
我无法在任何地方找到答案,但是当我尝试使用静态或 const 成员变量序列化结构或类时,默认情况下它们不会序列化。如果我尝试通过设置MemberSerialization.OptIn 来强制序列化,则会出现错误。
例如
[JsonObject(MemberSerialization.OptIn)]
public class Test
{
[JsonProperty]
public int x = 1;
[JsonProperty]
public static int y = 2;
}
如果我尝试用以下方式序列化这个类:
Test t = new Test();
string s = JsonConvert.SerializeObject( t );
我收到错误 Error getting value from 'y' on 'Test'。如果 y 是 const,也会发生同样的情况。
我的理论是 static 和 const 值存储在内存中的某个特殊位置,并且由于某种原因,Json 序列化程序在尝试访问它们时会死掉。不过,这完全是一种预感,我在C# Reference for Static 中看不到任何帮助。我对 C# 比较陌生 - 目前这确实是一个好奇的问题。
【问题讨论】:
-
与一些记忆无关。如果您将序列化视为获取类实例的快照,则静态变量不是 instances 的一部分。
-
我无法想象为什么任何人都需要序列化 static 甚至更少的 const 作为 JSON 对象的一部分。使用 const 尤其有趣……如何反序列化为常量?
-
除了反序列化回相同类型(例如,在 javascript 中使用序列化的 C# 对象)之外,还有其他用例可以序列化 AS JSON。因此,如果它是您感兴趣的数据的一部分,并且无论您在何处使用 json,该类本身都不可用,您可能需要对其进行序列化
-
@Stilgar 那你不是很有想象力,我的朋友。 JSON 被发送到我们的服务器。服务器处理 python 和 javascript 中的数据。静态值是一个版本标识符,它告诉服务器这是什么客户端版本,因此它可以不同地对待各种客户端。那应该是静态数据。我使用
readonly并在类定义中初始化变量,使其成为实例数据,但实际上,IMO 版本说明符应该是静态的。 另外问题是 serialize 而不是 deserialize。 -
@L.B 是的,当我这样考虑时,这是完全有道理的。我想这是一个愚蠢的问题,因为我也无法使用
t.y访问值 y ......哦,好吧。有时需要问一些愚蠢的问题......