asp.net JSON 序列化技術(shù)分析
更新時(shí)間:2010年03月21日 16:08:33 作者:
很多人看到的實(shí)例都是通過MS AJAX進(jìn)行PageMethod的調(diào)用,但因?yàn)榻鼉赡晡④浽谧鯝SP.NET與jQuery方面的合作實(shí)驗(yàn),我們其實(shí)也可以通過jQuery進(jìn)行PageMethod的調(diào)用。
在ASP.NET 3.5開始,.NET平臺(tái)下共支持兩種序列化方式:
1.DataContractSerializer
2.JavascriptSerializer
前者主要是根據(jù)數(shù)據(jù)契約(DataContract)進(jìn)行序列化,通過如下定義的數(shù)據(jù)契約:
代碼
<DataMember()> _
Public Class Model
<DataMember()> Public Property PropertyA As String
<DataMember()> Public Property PropertyB As String
<IgnoreDataMember()> Public Property PropertyC As String
End Class
其中會(huì)根據(jù)<DataMember>和<IgnoreDataMember>進(jìn)行屬性是否序列化的判斷。
根據(jù)數(shù)據(jù)契約序列化是有缺點(diǎn)的,它的缺點(diǎn)在于在數(shù)據(jù)類定義之初就需要對屬性是否進(jìn)行序列化進(jìn)行判定,對于在各處使用的數(shù)據(jù)模型(Data Model)可能會(huì)導(dǎo)致需要全部指定為DataMember,而將無用的屬性還有帶有默認(rèn)值(例如Nothing或Null)的屬性也同樣進(jìn)行序列化;二是,序列化不能使用屬性別名,在業(yè)務(wù)中定義的名稱可能過長,而如果不能指定屬性別名就會(huì)浪費(fèi)帶寬,導(dǎo)致服務(wù)器端與客戶端之間的通信變慢。
PageMethod是使用JSON序列化技術(shù)的最佳使用場景,在頁面實(shí)現(xiàn)異步調(diào)用(AJAX調(diào)用),而不用把所有邏輯都寫在服務(wù)中,UI方面的業(yè)務(wù)邏輯判斷處理可以寫在PageMethod中。在畫面插入如下ScriptManager聲明并指定EnablePageMethods為True即可將PageMethod打開。
<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true">
</asp:ScriptManager>
很多人看到的實(shí)例都是通過MS AJAX進(jìn)行PageMethod的調(diào)用,但因?yàn)榻鼉赡晡④浽谧鯝SP.NET與jQuery方面的合作實(shí)驗(yàn),我們其實(shí)也可以通過jQuery進(jìn)行PageMethod的調(diào)用。但jQuery的調(diào)用方法無法使用GET,只要POST空J(rèn)SON對象即可實(shí)現(xiàn)類GET調(diào)用。腳本如下:
$.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實(shí)例結(jié)果為:
{"A":"Hello","B":"World"}
這里再給大家提供一下網(wǎng)上比較流行的JSON轉(zhuǎn)換類,使用的是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
復(fù)制代碼 代碼如下:
1.DataContractSerializer
2.JavascriptSerializer
前者主要是根據(jù)數(shù)據(jù)契約(DataContract)進(jìn)行序列化,通過如下定義的數(shù)據(jù)契約:
代碼
復(fù)制代碼 代碼如下:
<DataMember()> _
Public Class Model
<DataMember()> Public Property PropertyA As String
<DataMember()> Public Property PropertyB As String
<IgnoreDataMember()> Public Property PropertyC As String
End Class
其中會(huì)根據(jù)<DataMember>和<IgnoreDataMember>進(jìn)行屬性是否序列化的判斷。
根據(jù)數(shù)據(jù)契約序列化是有缺點(diǎn)的,它的缺點(diǎn)在于在數(shù)據(jù)類定義之初就需要對屬性是否進(jìn)行序列化進(jìn)行判定,對于在各處使用的數(shù)據(jù)模型(Data Model)可能會(huì)導(dǎo)致需要全部指定為DataMember,而將無用的屬性還有帶有默認(rèn)值(例如Nothing或Null)的屬性也同樣進(jìn)行序列化;二是,序列化不能使用屬性別名,在業(yè)務(wù)中定義的名稱可能過長,而如果不能指定屬性別名就會(huì)浪費(fèi)帶寬,導(dǎo)致服務(wù)器端與客戶端之間的通信變慢。
PageMethod是使用JSON序列化技術(shù)的最佳使用場景,在頁面實(shí)現(xiàn)異步調(diào)用(AJAX調(diào)用),而不用把所有邏輯都寫在服務(wù)中,UI方面的業(yè)務(wù)邏輯判斷處理可以寫在PageMethod中。在畫面插入如下ScriptManager聲明并指定EnablePageMethods為True即可將PageMethod打開。
<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true">
</asp:ScriptManager>
很多人看到的實(shí)例都是通過MS AJAX進(jìn)行PageMethod的調(diào)用,但因?yàn)榻鼉赡晡④浽谧鯝SP.NET與jQuery方面的合作實(shí)驗(yàn),我們其實(shí)也可以通過jQuery進(jìn)行PageMethod的調(diào)用。但jQuery的調(diào)用方法無法使用GET,只要POST空J(rèn)SON對象即可實(shí)現(xiàn)類GET調(diào)用。腳本如下:
復(fù)制代碼 代碼如下:
$.ajax({
type: "POST",
url: "Default.aspx/GetJSON",
data: "{}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (msg) {
alert(msg);
}
});
PageMethod生命方法如下:
復(fù)制代碼 代碼如下:
<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實(shí)例結(jié)果為:
{"A":"Hello","B":"World"}
這里再給大家提供一下網(wǎng)上比較流行的JSON轉(zhuǎn)換類,使用的是JavascriptSerializer,代碼如下:
復(fù)制代碼 代碼如下:
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
您可能感興趣的文章:
相關(guān)文章
win2003服務(wù)器asp.net權(quán)限設(shè)置問題及解決方法
ASP.NET相對于ASP,設(shè)置權(quán)限方面有點(diǎn)不同,有一點(diǎn)兒設(shè)置錯(cuò)了都運(yùn)行不到。在網(wǎng)上搜索到的都是很垃圾的答案,沒有一個(gè)用得到的,下面是我自己設(shè)置并從中遇到的問題摸索后得到的經(jīng)驗(yàn),給大家分享。2011-08-08
ASP.NET Web應(yīng)用程序的安全解決方案淺析
ASP.NET Web應(yīng)用程序的安全解決方案淺析,讓大家在以后的開發(fā)中,多注意一下安全問題。2009-11-11
VisualStudio2019中為.NET Core WinForm App啟用窗體設(shè)計(jì)器
這篇文章主要介紹了VisualStudio2019中為.NET Core WinForm App啟用窗體設(shè)計(jì)器,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
獲取遠(yuǎn)程網(wǎng)頁的內(nèi)容之二(downmoon原創(chuàng))
獲取遠(yuǎn)程網(wǎng)頁的內(nèi)容之二(downmoon原創(chuàng))...2007-03-03

