源码网,源码论坛,源码之家,商业源码,游戏源码下载,discuz插件,棋牌源码下载,精品源码论坛

 找回密码
 立即注册
查看: 126|回复: 15

[ASP.NET] asp.net JSON 序列化技术分析

[复制链接]

7万

主题

861

回帖

32万

积分

论坛元老

Rank: 8Rank: 8

积分
329525
发表于 2010-3-21 16:08:33 | 显示全部楼层 |阅读模式
很多人看到的实例都是通过MS AJAX进行PageMethod的调用,但因为近两年微软在做ASP.NET与jQuery方面的合作实验,我们其实也可以通过jQuery进行PageMethod的调用。 在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
回复

使用道具 举报

1

主题

2万

回帖

69

积分

注册会员

Rank: 2

积分
69
发表于 2022-10-21 16:25:35 | 显示全部楼层
不错的源码论坛
回复 支持 反对

使用道具 举报

0

主题

1万

回帖

87

积分

注册会员

Rank: 2

积分
87
发表于 2022-12-12 15:27:20 | 显示全部楼层
好东西一定要看看!
回复 支持 反对

使用道具 举报

0

主题

2万

回帖

0

积分

中级会员

Rank: 3Rank: 3

积分
0
发表于 2023-3-3 04:41:42 | 显示全部楼层
来看看怎么样
回复 支持 反对

使用道具 举报

0

主题

2万

回帖

124

积分

注册会员

Rank: 2

积分
124
发表于 2023-3-13 20:38:26 | 显示全部楼层
强烈支持楼主ing……
回复 支持 反对

使用道具 举报

4

主题

2万

回帖

303

积分

中级会员

Rank: 3Rank: 3

积分
303
发表于 2023-8-22 12:15:41 | 显示全部楼层
的谁vdvdsvdsvdsdsv
回复 支持 反对

使用道具 举报

0

主题

1万

回帖

0

积分

中级会员

Rank: 3Rank: 3

积分
0
发表于 2024-3-7 01:18:48 | 显示全部楼层
还有什么好东西没
回复 支持 反对

使用道具 举报

29

主题

2万

回帖

194

积分

注册会员

Rank: 2

积分
194
发表于 2024-3-23 15:20:42 | 显示全部楼层
还不错啊
回复 支持 反对

使用道具 举报

0

主题

1万

回帖

0

积分

中级会员

Rank: 3Rank: 3

积分
0
发表于 2024-4-20 03:48:06 | 显示全部楼层
的谁vdvdsvdsvdsdsv
回复 支持 反对

使用道具 举报

0

主题

2万

回帖

194

积分

注册会员

Rank: 2

积分
194
发表于 2024-5-31 19:37:32 | 显示全部楼层
很不错的玩意
回复 支持 反对

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

手机版|小黑屋|网站地图|源码论坛 ( 海外版 )

GMT+8, 2024-11-30 06:00 , Processed in 0.070524 second(s), 24 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表