问题出在以下类:
[DebuggerDisplay("{Kind}: {Identifier}")]
public class SocialConnection
{
public virtual Guid UniqueId
{
get { return Id; }
set { Id = value; }
}
// SocialConnectionKind is an enumeration
public virtual SocialConnectionKind Kind { get; set; }
public virtual string Identifier { get; set; }
}
Kind 属性永远不会被序列化:当我请求一个具有关联的 SocialConnection 的对象时,我永远不会得到整个属性。
顺便说一句,如果我手动调用 JsonConvert.SerializeObject 它会被序列化。它应该与默认的媒体类型格式化程序有关,但到目前为止我还想不出解决方案。
请您参考如下方法:
导致此序列化问题的原因非常简单。检查 SocialConnectionKind 枚举:
public enum SocialConnectionKind
{
Skype,
Facebook,
Twitter,
LinkedIn,
Hangouts
}
您是否已经注意到可能出现的问题?如果该值是 Skype 以外的任何值,则不会重现该问题!
为什么?枚举以 0 开头,看看我是如何配置 WebAPI 的 HttpConfiguration 的:
config.Formatters.JsonFormatter.SerializerSettings.DefaultValueHandling =
DefaultValueHandling.Ignore;
Enum 默认底层类型 int 的默认值是什么?是的,它是 0。
那么,是什么解决了这个问题?
public enum SocialConnectionKind
{
Skype = 1, // <--- The issue was solved starting the enumeration from 1!
Facebook,
Twitter,
LinkedIn,
Hangouts
}
另一种方法
正如@Avner Shahar-Kashtan 在一些评论中指出的那样,我还可以使用 [JsonProperty(DefaultValueHandling = DefaultValueHandling.Include)] 属性解决此问题:
[DebuggerDisplay("{Kind}: {Identifier}")]
public class SocialConnection
{
public virtual Guid UniqueId
{
get { return Id; }
set { Id = value; }
}
// SocialConnectionKind is an enumeration
[JsonProperty(DefaultValueHandling = DefaultValueHandling.Include)]
public virtual SocialConnectionKind Kind { get; set; }
public virtual string Identifier { get; set; }
}
...这样就不需要从 1 开始枚举了。
无论如何,在我的特定情况下,我更喜欢使用 从 1 方法开始,因为我发现更清晰地避免使用特定于序列化的属性污染我的 POCO,因为 SocialConnection 类存在于一个共享库中,这个序列化问题是具体项目中的一个实现问题。
