某些属性在 Web API 操作中返回时不会序列化



问题与以下类有关:

[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类位于共享库中,而这个序列化问题是具体项目中的实现问题。

相关内容

  • 没有找到相关文章