【问题标题】:Why are values null when I add the Serializable attribute?当我添加 Serializable 属性时,为什么值为 null?
【发布时间】:2016-11-15 18:41:00
【问题描述】:

我有一个 WebAPI 2,我正在尝试将 Post 模型转换为其中一种方法。

我的完整 Postman 请求如下所示:

POST http://localhost:58900/api/v1/test HTTP/1.1
Host: localhost:58900
Connection: keep-alive
Content-Length: 295
Authorization: Bearer <<my bearer token>>
Postman-Token: 970cb0c1-3a8c-7a1e-763a-7dd916c035f3
Cache-Control: no-cache
Origin: chrome-extension://fhbjgbiflinjbdggehcddcbncdddomop
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36
Content-Type: application/json
Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.8,sv;q=0.6,fr;q=0.4

{
    MyProperty: 'Test',
    MyGuid: '67345ac2-551e-d16e-b448-e697e369dea1'
}

我的控制器方法如下所示:

[HttpPost]
public IHttpActionResult Post([FromBody]MyModel myModel)
{
    //Doing stuff
}

一切都按预期工作,但是当我将Serializable 属性添加到我的模型时,所有值都变为空,如下所示:

[Serializable]
public class MyModel
{
    public string MyProperty { get; set; }
    public Guid MyGuid { get; set; }
}

[HttpPost]
public IHttpActionResult Post([FromBody]MyModel myModel)
{
    //myModel.MyProperty is null and myModel.MyGuid is {00000000-0000-0000-0000-000000000000}
}

我假设(?)这是因为 Serialization 属性告诉运行时使用二进制格式化程序而不是我的配置中指定的 JsonFormatter - 但是,解决此问题的最佳方法是什么?

我首先需要Serialization 属性的原因是允许deep copy 的对象;

public static List<T> Clone<T>(this IEnumerable<T> list)
{
    var ms = new MemoryStream();
    var bf = new BinaryFormatter();
    bf.Serialize(ms, list);
    ms.Position = 0;
    return bf.Deserialize(ms) as List<T>;
}

【问题讨论】:

  • 你能在你的MyModel上面加上[JsonObject]吗?
  • 你的意思是代替[Serializable]?那不行,Clone 方法将无法序列化没有[Serializable] 的对象。
  • 将其添加为属性,介于 [Serializable]MyModel 之间。 stackoverflow.com/questions/29962044/…
  • 很好,这行得通,但我设法通过将 Clone 方法更改为 CloneJson 并使用 JsonConvert 类来深度复制对象来解决它。不知道哪个是最好的方法.请发布您的回复作为答案!

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


【解决方案1】:

发布我自己的替代答案;

一种可能的解决方案是更改深复制方法Clone 并使用JsonConvert 来复制对象,这样就可以从模型类中删除[Serializable] 属性;

public static T CloneJson<T>(this T source)
{
    if (ReferenceEquals(source, null)) return default(T);
    var deserializeSettings = new JsonSerializerSettings { ObjectCreationHandling = ObjectCreationHandling.Replace };
    return JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(source), deserializeSettings);
}

【讨论】:

    猜你喜欢
    • 2020-04-22
    • 1970-01-01
    • 1970-01-01
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多