C# 为什么在添加Serializable属性时值为空?

C# 为什么在添加Serializable属性时值为空?,c#,.net,serialization,asp.net-web-api,asp.net-web-api2,C#,.net,Serialization,Asp.net Web Api,Asp.net Web Api2,我有一个WebAPI 2,我正在尝试将一个模型发布到其中一个方法中 我的完整邮递员请求如下所示: 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

我有一个WebAPI 2,我正在尝试将一个模型发布到其中一个方法中

我的完整邮递员请求如下所示:

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
属性添加到我的模型时,所有值都变为null,如下所示:

[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
——但是,解决这个问题的最佳方法是什么

我首先需要
序列化
属性的原因是允许对象的
深度复制

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>;
}
公共静态列表克隆(此IEnumerable列表)
{
var ms=新内存流();
var bf=新的二进制格式化程序();
bf.序列化(ms,列表);
ms.Position=0;
返回bf.反序列化(ms)为列表;
}

发布我自己的备选答案

一种可能的解决方案是更改深度复制方法
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);
}
publicstatict CloneJson(此T源代码)
{
if(ReferenceEquals(source,null))返回默认值(T);
var deserializeSettings=new JsonSerializerSettings{ObjectCreationHandling=ObjectCreationHandling.Replace};
返回JsonConvert.DeserializeObject(JsonConvert.SerializeObject(源),反序列化设置);
}

发布我自己的备选答案

一种可能的解决方案是更改深度复制方法
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);
}
publicstatict CloneJson(此T源代码)
{
if(ReferenceEquals(source,null))返回默认值(T);
var deserializeSettings=new JsonSerializerSettings{ObjectCreationHandling=ObjectCreationHandling.Replace};
返回JsonConvert.DeserializeObject(JsonConvert.SerializeObject(源),反序列化设置);
}

您能尝试在您的
MyModel
之上使用
[JsonObject]
吗?您的意思是不是用
[Serializable]
?这将不起作用,
Clone
方法将无法序列化没有
[Serializable]
的对象。将其作为属性添加到
[Serializable]
MyModel
之间。很好,这很有效,但我通过将
Clone
方法更改为
CloneJson
并使用JsonConvert类来深度复制对象,成功地解决了这个问题。。不确定哪种方法是最好的。请将您的回复作为答案发布!您能在您的
MyModel
上尝试使用
[JsonObject]
吗?您的意思是代替
[Serializable]
?这将不起作用,
Clone
方法将无法序列化没有
[Serializable]
的对象。将其作为属性添加到
[Serializable]
MyModel
之间。很好,这很有效,但我通过将
Clone
方法更改为
CloneJson
并使用JsonConvert类来深度复制对象,成功地解决了这个问题。。不确定哪种方法是最好的。请将您的回复作为答案发布!