当前位置: 首页 > 面试题库 >

在WebAPI中的模型上使用Serializable属性

冯德佑
2023-03-14
问题内容

我有以下情形:我正在使用WebAPI,并根据模型将JSON结果返回给使用者。现在,我还具有将模型序列化为base64的附加要求,以便能够将其持久化在缓存中和/或用于审计目的。问题是,当我将[Serializable]属性添加到模型中以便将模型转换为Base64时,JSON输出更改如下:

该模型:

[Serializable]
public class ResortModel
{
    public int ResortKey { get; set; }

    public string ResortName { get; set; }
}

没有该[Serializable]属性,JSON输出为:

{
    "ResortKey": 1,
    "ResortName": "Resort A"
}

使用该[Serializable]属性,JSON输出为:

{
    "<ResortKey>k__BackingField": 1,
    "<ResortName>k__BackingField": "Resort A"
}

如何在[Serializable]不更改JSON输出的情况下使用属性?


问题答案:

默认情况下,Json.NET会忽略该Serializable属性。不过,根据要评论此答案由张曼玉颖,覆盖的WebAPI这种行为,这会导致你的输出。

默认情况下,Json.NET序列化程序将IgnoreSerializableAttribute设置为true。在WebAPI中,我们将其设置为false。遇到此问题的原因是Json.NET忽略了属性:“
Json.NET现在检测到具有Seri​​alizableAttribute的类型,并对该类型上的所有字段(包括公共字段和私有字段)进行序列化,并忽略属性”(引自james。
newtonking.com/archive/2012/04/11/…

一个简单的示例演示没有WebAPI时的相同行为,如下所示:

using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using System;
namespace Scratch
{
    [Serializable]
    class Foo
    {
        public string Bar { get; set; }
    }

    class Program
    {
        static void Main()
        {
            var foo = new Foo() { Bar = "Blah" };
            Console.WriteLine(JsonConvert.SerializeObject(foo, new JsonSerializerSettings()
                {
                    ContractResolver = new DefaultContractResolver()
                    {
                        IgnoreSerializableAttribute = false
                    }
                }));
        }
    }
}

有几种方法可以解决此问题。一种是用普通JsonObject属性装饰模型:

[Serializable]
[JsonObject]
class Foo
{
    public string Bar { get; set; }
}

另一种方法是覆盖的默认设置Application_Start()。根据此答案,默认设置应执行以下操作:

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings = new Newtonsoft.Json.JsonSerializerSettings();

如果那不起作用,您可以明确地知道它:

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings()
    {
        ContractResolver = new DefaultContractResolver()
        {
            IgnoreSerializableAttribute = true
        }
    };


 类似资料:
  • 问题内容: 在模型类中使用JavaFX bean属性是否正确? 我想知道在模型类中使用属​​性是否能够将它们与视图组件轻松绑定是否是一种好习惯。我不担心将来这些库的可用性,因为我的程序将在JRE8或更高版本上运行,但是在模型类中使用JavaFX库的性质使我持怀疑态度,并且我担心当前和将来的不兼容性,尤其是因为我想使用Hibernate来保留这些属性。 注意:我使用纯JavaFX环境,并且我的应用程

  • 我的Html代码是这样的。 课程:- 当我调用MVC控制器时,通过上层输入,绑定就发生了。以下方法的方法 x中的值是 但是当我在web api中尝试同样的事情时,它给了我415(不支持的媒体类型)。方法如下 它没有绑定,而是给出了415状态代码,上面写着不支持的媒体类型。我知道这么问很蠢但为什么会这样?如果我想做相同的绑定发生在mvc如何实现?我不想做这样的事 有没有办法做到这一点?

  • 我试图发送模型,这部分是一些IFormFile类型的属性,代表用户头像。但不幸的是,我的头像属性总是空的,我看到了很多如何发送单个图片元素的示例,但我可以找到如何发送它的示例,当它是模型的一部分而不是一个单一的元素,就像这里做的那样 下面是我的组件方法,我在其中设置了这个道具 } 下面是我的后端put方法(ASP.NET核心) 这里还有remove[FromBody],在这种情况下不要改变任何东西

  • javafx属性是将数据模型连接到javafx gui的好方法,因为它们的绑定模型实现了强大的通知更新机制。 属性和绑定并不严格地与GUI相关,而是对JavaBeans的扩展。 因此,我们希望在应用程序模型类中使用它们,而不引入对包的依赖关系,并且通常来自. 换句话说:(update) 我可能需要将应用程序分成两个模块。 一个模块应该只包含操作数据的类(模型类,说MVC)。 第二个模块将包含所有图

  • 问题内容: 是否可以一次更新父模型和关联模型的属性?我无法使其正常工作,并且无法找到任何完整的示例。我不确定我的代码是否有问题或是否没有按照我期望的方式工作。我尝试将onUpdate:’cascade’添加到我的hasMany定义中,但这似乎无济于事。 楷模: 检索过滤器并尝试更新关联的FilteredContent对象上的属性: 这导致仅Filter对象中的属性被更新。如何获取它还更新Filte

  • 问题内容: 我目前正在学习Django,我的一些模型具有自定义方法来获取以特定方式格式化的值。是否可以使用order_by()在模型中定义为属性的这些自定义方法之一的值? 这是一个演示该属性如何实现的示例。 使用此模型,我可以执行以下操作: 但是我不能: 在这样的自定义属性上使用order_by的正确方法是什么? 问题答案: 不,你不能那样做。是在数据库级别应用的,但是数据库对你的自定义Pytho