using System.Collections.Generic;
using Newtonsoft.Json.Serialization;
using static Newtonsoft.Json.JsonConvert;
class Ref { public int a {get;set;} public string b {get;set;} public DateTime c {get;set;} }
class DerivedRef : Ref { public bool d {get;set;} public long e {get;set;} }
class Ref2 { public int a {get;set;} public string b {get;set;} public DateTime c {get;set;} }
class DerivedRef2 : Ref2 { public bool d {get;set;} public long e {get;set;} }
public class StrictTypeContractResolver<T>: DefaultContractResolver
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
if(type.IsSubclassOf(typeof(T)))
return base.CreateProperties(typeof(T), memberSerialization);
return base.CreateProperties(type, memberSerialization);
public static void Main()
new Ref{a=1,b="2",c=DateTime.Now}
,new DerivedRef{a=1,b="2",c=DateTime.Now,d=true,e=999}
Console.WriteLine(PerformSerialization(list));
new Ref2{a=1,b="2",c=DateTime.Now}
,new DerivedRef2{a=1,b="2",c=DateTime.Now,d=true,e=999}
Console.WriteLine(PerformSerialization(list2));
public static string PerformSerialization<T>(IList<T> list)
var settings = new JsonSerializerSettings { ContractResolver = new StrictTypeContractResolver<T>(), Formatting = Formatting.Indented };
return SerializeObject(list, settings);