[英]Serializing .MinValue of value types (C#) in ASP.NET Web API 2 to null
[英]ASP.NET Web API is serializing with underscore
我在ApiController中有以下簡單代碼:
public Version Get()
{
var version = new System.Version(1, 1, 0, 0);
return version;
}
結果如下:
json
{"_Major":1,"_Minor":1,"_Build":0,"_Revision":0}
XML文件
<Version xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/System">
<_Build>0</_Build>
<_Major>1</_Major>
<_Minor>1</_Minor>
<_Revision>0</_Revision>
</Version>
請注意,屬性前面帶有_
。 查看Version
的類定義,所有這些屬性僅是Getters
,我懷疑這與為何序列化添加_
。 我還嘗試在此處查找有關發生這種情況的信息,但所有信息都表明Read-only properties are serialized by default.
問題是,下划線使客戶端上的反序列化變得混亂,並導致版本為0.0.0.0
。
這是CLR類,我無法覆蓋它,因此如何刪除下划線,以便在客戶端上正確反序列化?
默認情況下,Web API序列化具有[Serializable]屬性(例如,Version)的類型的字段。 我不是它的忠實擁護者,這就是為什么Json.NET在默認情況下不這么做的原因,但這就是Web API人士想要的。
這將停止Web API使用JSON進行操作:
var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.ContractResolver = new DefaultContractResolver();
在不更改整個序列化程序的情況下,您可以返回與CLR Version類映射的自定義對象。
版本號不應該經常更改。 我建議對此發表評論,以免您將來的自我重構。
如果您正在使用DataContractSerializer,請嘗試以下操作:
config.Formatters.XmlFormatter.SetSerializer(myType, new DataContractSerializer(myType, new DataContractSerializerSettings() { SerializeReadOnlyTypes = true });
否則,請確保JSON.NET是最新的。
序列化只讀屬性應該沒有任何困難。
我已經使用JSON.NET進行了測試,它似乎拾取了像您的輸出一樣命名的字段,並且完全避免使用公共屬性。
作為臨時解決方案,我將復制對象並返回它,以便更好地控制序列化。
最新的JSON.NET和MVC二進制文件提供了相同的結果。 如果設置控制台應用程序並使用JSON.NET進行序列化,則會獲得預期的版本(無下划線)。 您可以嘗試使用媒體類型格式化程序和序列化程序來煩躁,但老實說,我只是創建一個值對象來包裝Version並完成它。
我還嘗試創建一個具有只讀屬性的值對象,並且還創建了沒有setter的字段支持的屬性。 全部序列化而沒有下划線。 必須是Version類本身中的東西。
抱歉,這個問題我不能幫您。 在不同情況下,我也有類似的情況。 我只能建議您使用
希望對您有所幫助。
如果您想快速解決問題,這里有一個
public object Get()
{
var version = new System.Version(1, 2, 3, 4);
return new
{
version.Build,
version.Major,
version.Minor,
version.Revision
};
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.