gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 21:12:57 25 4
gpt4 key购买 nike

问题出在以下类:

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

关于c# - 在 Web API 操作中返回时,某些属性不会被序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36447772/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com