【问题标题】:JSON Static Properties Serialization Not WorkingJSON 静态属性序列化不起作用
【发布时间】:2017-12-21 16:04:08
【问题描述】:

我知道为什么静态变量的序列化默认不起作用,但this question 的答案似乎表明使用正确的属性是可能的。

我的班级是这样的:

[JsonObject(MemberSerialization.OptIn)]
public class c
{
    [JsonProperty]
    public static double x{ get; set; } = 70;
    [JsonProperty]
    public static double y{ get; set; } = 36;
    [JsonProperty]
    public static double z{ get; set; } = 12;
}

并通过

进入JSON.net
StatePersister.SaveState(new c(), fileName);


public static void SaveState(Object o, string savePath, FileFormat? format = null)
{
    DataContractJsonSerializerSettings settings = new DataContractJsonSerializerSettings { UseSimpleDictionaryFormat = true };
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(o.GetType(), settings);
    using (var stream = File.Create(savePath))
    {
        using (var writer = JsonReaderWriterFactory.CreateJsonWriter(stream, Encoding.UTF8, true, true, "\t"))
        {

            serializer.WriteObject(writer, o);
            writer.Flush();
        }
    }
}

我已经尝试过使用和不使用 [JsonObject(MemberSerialization.OptIn)] 属性,无论哪种方式,我都会得到一个只包含“{}”的文件

单步执行代码我知道对象正在被实例化,并且它正在以正确的信息传递给正确的对象。

【问题讨论】:

  • 为什么你还有静态属性?为什么不让它们变成非静态的呢?
  • 出于同样的原因,任何人都使用静态变量。我们需要可以从代码中的任何地方访问的变量,永远不需要不止一次的实例,传递单个实例会很混乱,并且可能会为很多错误打开机会。从任何地方对这些属性所做的任何更改都需要在整个程序中同步。

标签: c# json serialization json.net


【解决方案1】:

您正在使用 Json.Net 属性,但您没有使用 Json.Net 序列化程序。 DataContractJsonSerializer 是 .Net 框架的一部分,而不是 Json.Net,因此它不会支持 [JsonObject][JsonProperty] 属性。此外,DataContractJsonSerializer 不支持序列化静态成员,即使您确实使用了正确的属性(分别为[DataContract][DataMember])。如果要序列化静态成员,则需要使用 Json.Net 的 JsonSerializer

using (var stream = File.Create(savePath))
using (TextWriter textWriter = new StreamWriter(stream, Encoding.UTF8))
using (JsonWriter jsonWriter = new JsonTextWriter(textWriter))
{
    JsonSerializer serializer = new JsonSerializer();
    serializer.Serialize(jsonWriter, o);
}

小提琴:https://dotnetfiddle.net/lYzDEE

注意:如果您的 JSON 很小,您实际上并不需要流。您可以将代码简化为:

string json = JsonConvert.SerializeObject(o);
File.WriteAllText(savePath, json, Encoding.UTF8);

【讨论】:

  • 那行得通,我只是在调用我们创建的遗留方法。新版本是更新到 JSON.net 的版本,它运行良好。我们导出的数据通常也很大。我刚刚为帖子提供了一个子样本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-10
  • 1970-01-01
  • 2013-01-29
  • 1970-01-01
  • 1970-01-01
  • 2022-12-11
相关资源
最近更新 更多