Skip to main content
 首页 » 编程设计

c#之在 Web API 操作中返回时,某些属性不会被序列化

2024年02月05日29arxive

问题出在以下类:

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