変更されたプロパティのみをシリアライズしたい。ルート型に対してはなんとかできましたが、シリアル化する他のオブジェクトへの参照が含まれています (同じ型である可能性もあります)。
これは私のインターフェイスと ContractResolver です:
public interface ISelectiveJsonSerialize
{
IList<string> PropertiesToSerialize { get; }
}
public class JsonSelectiveSerializeContractResolver : DefaultContractResolver
{
private readonly IList<string> _propertiesToSerialize;
public JsonSelectiveSerializeContractResolver(IList<string> propertiesToSerialize)
{
_propertiesToSerialize = propertiesToSerialize;
}
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
{
return base.CreateProperties(type, memberSerialization).Where(p => _propertiesToSerialize.Contains(p.PropertyName)).ToList();
}
}
プロパティ PropertiesToSerialize には、値を受け取ったプロパティ名のリストがあります。
これは私がシリアル化する方法です:
string result = "";
if (val is ISelectiveJsonSerialize)
{
// Don't serialize all properties
var resolver = new JsonSelectiveSerializeContractResolver(((ISelectiveJsonSerialize)val).PropertiesToSerialize);
var settings = new JsonSerializerSettings { ContractResolver = resolver };
result = JsonConvert.SerializeObject(val, Formatting.None, settings);
}
else
{
// Default serialization
result = JsonConvert.SerializeObject(val);
}
return result;
これは、シリアル化できる型の例です。
public class Category : BaseType
{
private string _name;
public string Name
{
get { return _name; }
set
{
_name = value;
PropertiesToSerialize.Add("Name");
}
}
private Category _category;
public Category Category
{
get { return _category; }
set
{
_category = value;
PropertiesToSerialize.Add("Category");
}
}
}
理解できるように、名前を持つルート タイプのカテゴリのみを設定すると、ルート PropertiesToSerialize に「名前」が含まれていないため、名前がシリアル化されません。ルート エンティティ。
ヘルプ?