【问题标题】:ASP.NET Web API Serialize only public members or properties (ignore fields)ASP.NET Web API 仅序列化公共成员或属性(忽略字段)
【发布时间】:2017-06-29 10:57:36
【问题描述】:

是否有可能在 ASP.NET Web API 中定义只应序列化公共成员或只应序列化属性?

背景是:我们将每个属性的初始值存储在自己的私有字段中(参见下面的示例)。现在的问题是这些字段在我们的 Rest Application 中也是序列化的,但这并没有真正的用处,因为这个 API 主要由外部客户使用。删除 DataMember 属性也不是一个选项,因为我们还有 WCF 服务,这些字段需要序列化和传输。

    [DataMember]
    private bool seasonNameIsInitialized;
    [DataMember]
    private string seasonName;
    [DataMember]
    private string seasonNameInitial;

    /// <summary>
    /// Season Name
    /// </summary>
    [Required]
    [MaxLength(100)]
    [Display(ResourceType = typeof(ResourcesModel), Name = nameof(ResourcesModel.SeasonName))]
    [DatabaseColumn(Name = "BEZ")]
    [DataMember]
    public string SeasonName
    {
        get
        {
            return seasonName;
        }
        set
        {
            string oldSeasonName = seasonName;
            seasonName = value;

            if (seasonNameIsInitialized)
            {
                OnPropertyChanged(oldSeasonName, seasonName);
            }
            else
            { 
                seasonNameInitial = value;
                seasonNameIsInitialized = true;
            }
        }
    }

【问题讨论】:

  • 不同的 API,不同的 DTO。您不能创建 一个 DTO 来处理自相矛盾的要求。有人说你的 API 模型不是你的资源模型不是你的域模型不是你的 DTO 模型不是你的数据模型
  • @jdwen XML Serializer 属性与 Web API 有什么关系?
  • 在 SOAP 中使用字段进行序列化也不是一个好主意。 clientserver 关心以前的值或更改通知?这只是一个 DTO,而不是域实体。您是否尝试对所有 API 使用与域实体和 DTO 相同的类?
  • @PanagiotisKanavos:但这两个模型完全一样,除了某些字段的 DataMember 属性。由于我们有数百个模型类,因此需要做很多工作。这对我们来说不是一个真正的选择。有没有可能影响 Web API 中序列化的成员?
  • 所以这两个模型根本不一样。听起来您确实尝试对显示、WCF 和 Web API 使用相同的实体。 OnPropertyChanged 对 WCF DTO 没有任何意义。您是否在服务器和桌面上使用相同的类?

标签: c# json wcf asp.net-web-api serialization


【解决方案1】:

对于JSon 序列化,您可以通过设置[JsonIgnore] 属性来使用NewtonSoft

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;

namespace JsonIgnore
{
    class Program
    {
        static void Main(string[] args)
        {
            var obj = new myClass() { Age = 18, Name = "Max" };
            var selializedObj = JsonConvert.SerializeObject(obj);
            Console.WriteLine(selializedObj.ToString());
            Console.ReadLine();
        }
    }

    [DataContract]
    public class myClass
    {
        [JsonIgnore]
        [DataMember]
        public int Age { get; set; }
        [DataMember]
        public string Name { get; set; }
    }
}

带有[JsonIgnore]属性的结果是{"Name" : "Max"}, 没有[JsonIgnore] 属性结果是{"Name" : "Max", "Age" : 18}

【讨论】:

  • OP 添加了DataMember 属性以明确要求序列化。我认为 JSON.Net 理解这两个属性。看看它在这种情况下的表现会很有趣。是否有记录在案的优先级或行为是否会从一个版本更改为下一个版本
  • 我改变了答案并添加了小例子
  • 这是记录还是仅仅因为属性被评估的顺序而起作用?
  • 还有可能忽略xml吗? (我们的 Web API 应用程序同时支持 json 和 xml)
  • 如果你忽略 xml 你会遇到 wcf 的问题
猜你喜欢
  • 2013-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-31
  • 2012-03-11
  • 2013-11-09
相关资源
最近更新 更多