[英]NewtonSoft.json base class serialization
当我将相关的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]。 我需要所有成员进行序列化。 问题:
最好的前进方法是什么?
默认情况下,基类属性被忽略。 您可以通过创建自定义合同解析器来更改此行为。
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"
}
使用JsonProperty
public class MyBaseClass
{
[JsonProperty("BaseProp1")]
public string BaseProp1 { get; set; }
[JsonProperty("BaseProp2")]
public string BaseProp2 { get; set; }
}
[DataContract]
public class MyDerivedClass : MyBaseClass
{
[JsonProperty("DerProp1")]
[DataMember]
public DateTime DerProp1 { get; set; }
[JsonProperty("DerProp2")]
public string DerProp2 { get; set; }
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.