问题与以下类有关:
[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; }
}
这样就不需要从CCD_ 12开始枚举。
无论如何,在我的特定情况下,我更喜欢使用从1
开始的方法,因为我发现更干净的方法可以避免用序列化特定的属性污染我的POCO,因为SocialConnection
类位于共享库中,而这个序列化问题是具体项目中的实现问题。