【发布时间】:2016-02-02 11:19:23
【问题描述】:
我正在使用 Newtonsoft.Json 序列化缓存值,我想知道是否有一种方法可以像从序列化中排除方法一样排除可执行属性?最好是一种全局设置的方法,这样我就不需要用属性标记数百个属性(我首先必须在数千个属性中找到)。
代码:
[Serializable]
public class Item
{
public long Id { get; set; }
public string Name { get; set; }
public List<Image> Images { get; set; }
public Image PrimaryImage { get { return Images[0]; } }
}
[Serializable]
public class Image
{
public long Id { get; set; }
public string FileName { get; set; }
}
错误:
Error getting value from 'PrimaryImage' on 'Item'.
at Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue(Object target)
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CalculatePropertyValues(JsonWriter writer, Object value, JsonContainerContract contract, JsonProperty member, JsonProperty property, JsonContract& memberContract, Object& memberValue)
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeList(JsonWriter writer, IEnumerable values, JsonArrayContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value, Type objectType)
at Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter, Object value, Type objectType)
at Newtonsoft.Json.JsonConvert.SerializeObjectInternal(Object value, Type type, JsonSerializer jsonSerializer)
我还要提到 PrimaryImage 中的逻辑已被简化,因此解决方案是不要跳过使用该属性。这似乎是属性的一种很常见的用法,所以我觉得奇怪的是它还没有处理它。
【问题讨论】:
-
您可以创建一个
ContractResolver:stackoverflow.com/questions/33258314/… 我提供的答案是针对忽略特定类型的属性,但可以根据您的需要进行修改。也可以全局设置,很方便。 -
@Ric 这是朝着正确方向迈出的一步,但您有什么建议可以区分简单数据容器的属性和可执行的属性吗?
-
您将什么定义为可执行文件?
-
@Ric 似乎序列化程序对任何不是 { get; 的属性都有问题。放; } 自动实现的属性,所以这就是我的定义。任何定义了访问器的属性。
-
我确信排除只读/只写属性很容易事实上这里是显示可用选项的文档newtonsoft.com/json/help/html/…
标签: c# json serialization properties