gpt4 book ai didi

c# - NewtonSoft.json 基类序列化

转载 作者:行者123 更新时间:2023-11-30 20:23:35 24 4
gpt4 key购买 nike

当我将相关的 Newtonsoft.json.dll 从 .NET 3.5 更新到 .NET 4.5 时,基类未序列化。在更新之前,基类正在序列化。

public class MyBaseClass
{
public string BaseProp1 { get; set; }
public string BaseProp2 { get; set; }
}

[DataContract]
public class MyDerivedClass : MyBaseClass
{
[DataMember]
public DateTime DerProp1 { get; set; }
public string DerProp2 { get; set; }
}


class Program
{
static void Main(string[] args)
{
MyDerivedClass derc = new MyDerivedClass();
derc.BaseProp1 = "BaseProp1";
derc.DerProp1 = DateTime.Now;
derc.BaseProp2 = "BaseProp2";
derc.DerProp2 = "DerProp2";

Newtonsoft.Json.Converters.IsoDateTimeConverter conv = new Newtonsoft.Json.Converters.IsoDateTimeConverter();
conv.DateTimeFormat = "MM/dd/yyyy HH:mm:ss zzz";

string jsonSerializedObject = JsonConvert.SerializeObject(derc, conv);

}
}

程序不序列化基类的成员。原因是我没有在基类中指定 [DataContract]。我需要对所有成员进行序列化。问题:

  1. 我无法从派生类中删除 [DataContract],因为它被 WCF 广泛使用。
  2. 我不想将 [DataContract] 添加到基类,因为有很多成员。

继续前进的最佳方式是什么?

最佳答案

默认情况下忽略基类属性。您可以通过创建自定义契约(Contract)解析器来更改此行为。

class MyContractResolver : DefaultContractResolver
{
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
{
var list = base.CreateProperties(type, memberSerialization);

foreach (var prop in list)
{
prop.Ignored = false; // Don't ignore any property
}

return list;
}
}

这个解析器将有效地确保没有属性被忽略。如果您确实希望忽略某些属性,则可能需要应用一些逻辑。

使用解析器;创建一个 JsonSerializerSettings 实例并将其提供给 JsonConvert.SerializeObject 方法。

您的最后一行将被替换为:

JsonSerializerSettings settings = new JsonSerializerSettings
{
ContractResolver = new MyContractResolver(),
Converters = { conv },
};

string jsonSerializedObject = JsonConvert.SerializeObject(derc, settings);

然后将序列化基类属性:

{
"DerProp1":"02-17-2015 13:39:29 +01:00",
"DerProp2":"DerProp2",
"BaseProp1":"BaseProp1",
"BaseProp2":"BaseProp2"
}

关于c# - NewtonSoft.json 基类序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28561026/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com