我无法在任何地方找到答案,但是当我尝试使用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.
从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 代码都可以访问常量。
| 归档时间: |
|
| 查看次数: |
10708 次 |
| 最近记录: |