asp.net JSON 序列化技術分析

來源:互聯網
上載者:User

在ASP.NET 3.5開始,.NET平台下共支援兩種序列化方式: 複製代碼 代碼如下:1.DataContractSerializer
2.JavascriptSerializer

前者主要是根據資料契約(DataContract)進行序列化,通過如下定義的資料契約:
代碼 複製代碼 代碼如下:<DataMember()> _
Public Class Model
<DataMember()> Public Property PropertyA As String
<DataMember()> Public Property PropertyB As String
<IgnoreDataMember()> Public Property PropertyC As String
End Class

其中會根據<DataMember>和<IgnoreDataMember>進行屬性是否序列化的判斷。
根據資料契約序列化是有缺點的,它的缺點在於在資料類定義之初就需要對屬性是否進行序列化進行判定,對於在各處使用的資料模型(Data Model)可能會導致需要全部指定為DataMember,而將無用的屬性還有帶有預設值(例如Nothing或Null)的屬性也同樣進行序列化;二是,序列化不能使用屬性別名,在業務中定義的名稱可能過長,而如果不能指定屬性別名就會浪費頻寬,導致伺服器端與用戶端之間的通訊變慢。
PageMethod是使用JSON序列化技術的最佳使用情境,在頁面實現非同步呼叫(AJAX調用),而不用把所有邏輯都寫在服務中,UI方面的商務邏輯判斷處理可以寫在PageMethod中。在畫面插入如下ScriptManager聲明並指定EnablePageMethods為True即可將PageMethod開啟。
<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true">
</asp:ScriptManager>
很多人看到的執行個體都是通過MS AJAX進行PageMethod的調用,但因為近兩年微軟在做ASP.NET與jQuery方面的合作實驗,我們其實也可以通過jQuery進行PageMethod的調用。但jQuery的調用方法無法使用GET,只要POST空JSON對象即可實作類別GET調用。指令碼如下: 複製代碼 代碼如下:$.ajax({
type: "POST",
url: "Default.aspx/GetJSON",
data: "{}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (msg) {
alert(msg);
}
});

PageMethod生命方法如下: 複製代碼 代碼如下:<WebMethod()> _
Public Shared Function GetJSON() As String
Dim list As New List(Of Model)
For index As Integer = 0 To 1000
Dim m_JSON As New Model With {.PropertyA = "Hello", .PropertyB = "World"}
list.Add(m_JSON)
Next
Dim str As String = JSONHelper.Serialize(list)
Return str
End Function
[code]
其中Model類定義如下:
[code]
<DataContract()> _
Public Class Model
<DataMember(EmitdefaultValue:=False, IsRequired:=False, Name:="A")> Public Property PropertyA As String
<DataMember(EmitdefaultValue:=False, IsRequired:=False, Name:="B")> Public Property PropertyB As String
<DataMember(EmitdefaultValue:=False, IsRequired:=False, Name:="C")> Public Property PropertyC As String
End Class

序列化的Model執行個體結果為:
{"A":"Hello","B":"World"}
這裡再給大家提供一下網上比較流行的JSON轉換類,使用的是JavascriptSerializer,代碼如下: 複製代碼 代碼如下:Public Class JSONHelper
Public Shared Function Serialize(Of T)(ByVal obj As T) As String
Dim serializer As New System.Runtime.Serialization.Json.DataContractJsonSerializer(obj.GetType())
Dim ms As New MemoryStream()
serializer.WriteObject(ms, obj)
Dim retVal As String = Encoding.Default.GetString(ms.ToArray())
Return retVal
End Function
Public Shared Function Deserialize(Of T)(ByVal json As String) As T
Dim obj As T = Activator.CreateInstance(Of T)()
Dim ms As New MemoryStream(Encoding.Unicode.GetBytes(json))
Dim serializer As New System.Runtime.Serialization.Json.DataContractJsonSerializer(obj.GetType())
obj = CType(serializer.ReadObject(ms), T)
ms.Close()
Return obj
End Function
End Class

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.