0

今天,我發現MVC4使用的XML和Json序列化程序之間存在着很大的不同。MVC4中的XML和Json序列化程序之間的區別

我試圖返回一個對象,看起來像這樣:

public class Person 
{ 
    public string FirstName {get;set;} 
    public string LastName {get;set;} 
    public string FullName{ get{ return FirstName + " " + LastName }} 
} 

當客戶端請求JSON作爲結果,我得到FirstNameLastNameFullName與預期值返回。

但是,當客戶端請求XML數據時,他只得到FirstNameLastName

這在我看來非常糟糕,因爲這意味着客戶端將根據他們請求的格式獲取不同的數據。

看起來這是故意的,因爲Json序列化程序的文檔說默認包含只讀屬性,並且默認情況下它們被排除在外的Xml序列化程序。

所以我的問題是:如何更改MVC4使用的Xml序列化程序,以便默認包含那些只讀的。我知道它可以管理,因爲如果將DataContract屬性添加到類中,並且將DataMember屬性添加到類的每個屬性,它也會返回只讀變量,但我真的不想這樣做。

回答

0

您必須使用datacontractserializer並使用DataContract屬性標記實體,並使用DataMember序列化每個成員。

datacontractserializer允許只讀屬性的序列化。

+0

重新閱讀我的問題:我做**不**想用'DataContract/DataMember'屬性標記所有的類就是爲了這個。我想更改序列化程序中的設置以默認包含只讀屬性(就像Json序列化程序一樣) –

0

首先,我會推薦這篇文章:

http://www.asp.net/web-api/overview/formats-and-model-binding/json-and-xml-serialization#xml_readonly

,因爲它提供系列化的中的WebAPI/MVC優良的破舊包括展示如何告訴MVC使用什麼串行器(如果你決定來實現你自己的解決只讀問題)

現在,如果你想使用默認序列化程序(DataContract或Xml),不幸的是你不能告訴它自動序列化只讀屬性;這是通過設計 - 如果你考慮它,它會產生某種意義;因爲典型的用例的XML序列化是

  • 序列化A型
  • 發送跨線/保存到磁盤
  • 在未來
  • 反序列化讀取它在某一點到實例的A類

我會想象這是因爲傳統上(之前有很多概念,你可能希望通過HTTP發送這個數據到一個弱 - 鍵入的基於瀏覽器的語言),它將使串行化只讀屬性沒有意義 - 因爲您無法反序列化回原始類型,因爲該字段是隻讀的!

當然,現在它有很多意義,您可能需要這些,我相信JSON序列化器人員在決定爲JSON默認包含只讀屬性時會考慮到這一點,因爲更典型的用法這種情況不是序列化返回到強類型實例,而是返回到動態類型的java腳本對象。

即 給出

public class Foo 
    { 
     public int Bar { get; set; } 
     public string BarName { get { return "This is Bar# " + Bar; } } 
    } 

讓我們默認的XML或DataContract串行生產這種假設:

<Foo> 
    <Bar>10</Bar> 
    <BarName>This is Bar# 10</BarName> 
    </Foo> 

你會如何期待下面的代碼工作?

var xs = new XmlSerializer(typeof(Foo)); 
var y = xs.Deserialize(new StreamReader(@"C:\foo.xml")) as Foo; 

沒有拋出異常BarName是隻讀屬性?

非可設置屬性的整個觀點是,組成getter返回值的條件是未知的(即私有)給調用者,因此不能被序列化......

因此,DataContractDataMembers它允許您覆蓋默認行爲。

相關問題