序列化类名称 |
标记Serializable特性时 |
标记Datacontract特性时 |
备注 |
XmlSerializer |
只能序列化公共字段和属性,不能序列化方法、索引器、私有字段或只读属性(只读集合除外). |
没试过 |
|
BinaryFormatter |
所有的都序列化 |
没试过 |
|
DataContractJsonSerializer |
只序列化字段(包括私有字段和公共字段),如果属性没有对应的字段,则自动为其生成私有字段然后序列化。 |
只序列化标记为DataMember的字段或者属性(包括私有的和公共的) |
可以生成Json |
JsonQueryStringConverter |
只序列化字段(包括私有字段和公共字段),如果属性没有对应的字段,则自动为其生成私有字段。 |
只序列化标记为DataMember的字段或者属性(包括私有的和公共的) |
可以生成Json |
JavaScriptSerializer |
序列化公共的字段或者属性 |
序列化公共的字段或者属性,不管是否标记DataMember(如果私有字段标记了DataMember也不会序列化,同样,如果公共字段没有标记DataMember也会被序列化) |
可以生成Json(已过时,这个类很变态) |
DataContractSerializer |
序列化所有的字段和属性(包括私有和共有的,但是标记为NoSerializable的除外) |
只序列化标记为DataMember的字段或者属性(包括私有的和公共的) |
适合轻量级的应用,客户端序列化和反序列化可用Json的JSON.parse()和JSON.stringify(),
但服务端序列化和反序列化的时候,遇到一些问题,我采用了三种方式,其中三种方式序列化和反序列化的方式各有不同,比较请点这里看。
以下是我的操作的代码:
前台:
1<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2<html xmlns="http://www.w3.org/1999/xhtml" >
3<head runat="server">
4 <title>无标题页</title>
5 <script type="text/javascript" src="../JS/jquery-1.3.min.js"></script>
6 <script type="text/javascript" src="../JS/json2.js"></script>
7 <script type="text/javascript">
8 function GetValue()
9 {
10 $.get("Process.aspx", {Action:"get"}, function (data, textStatus){
11 var name=$("#TName")[0];
12 var address=$("#TAddress")[0];
13 var age=$("#TAge")[0];
14 var obj=JSON.parse(data);
15 name.value=obj.Name;
16 address.value=obj.Address;
17 age.value=obj.Age;
18 });
19 }
20
21 function SetValue()
22 {
23 var person=new Person($("#TName")[0].value,$("#TAddress")[0].value,$("#TAge")[0].value);
24 var str=JSON.stringify(person);
25 alert(str);
26 $.post("Process.aspx", {Action:"post",JsonStr:""+ str +""}, function (data, textStatus){
27 alert("发送成功");
28 });
29 }
30
31 function Person(name,address)
32 {
33 this.Name=name;
34 this.Address=address;
35 }
36 </script>
37</head>
38<body>
39 <form id="form1" runat="server">
40 <div>
41 <table>
42 <tr>
43 <td>姓名:</td>
44 <td><input type="text" id="TName" /></td>
45 </tr>
46 <tr>
47 <td>住址:</td>
48 <td><input type="text" id="TAddress"/></td>
49 </tr>
50 <tr>
51 <td>年龄:</td>
52 <td><input type="text" id="TAge" /></td>
53 </tr>
54 </table>
55 <table>
56 <tr>
57 <td><input type="button" onclick="GetValue();" value="加载数据"></td>
58 <td><input type="button" value="更新数据" onclick="SetValue()"></td>
59 </tr>
60 </table>
61 </div>
62 </form>
63</body>
64</html>
后台:
1 using System;
2 using System.Collections;
3 using System.Configuration;
4 using System.Data;
5 using System.Linq;
6 using System.Web;
7 using System.Web.Security;
8 using System.Web.UI;
9 using System.Web.UI.HtmlControls;
10 using System.Web.UI.WebControls;
11 using System.Web.UI.WebControls.WebParts;
12 using System.Xml.Linq;
13 using System.Runtime.Serialization.Json;
14 using System.ServiceModel.Dispatcher;
15 using System.Text;
16 using System.Web.Script.Serialization;
17 using System.IO;
18 using System.Runtime.Serialization;
19 namespace WebDemo.AjaxTest
20 {
21 public partial class Process : System.Web.UI.Page
22 {
23 protected void Page_Load(object sender, EventArgs e)
24 {
25 if (!Request.Params.AllKeys.Contains("JsonStr"))
26 {
27 GetData();
28 }
29 else
30 {
31 LoadData();
32 }
33 }
34 /// <summary>
35 /// 从客户端加载数据
36 /// </summary>
37 private void LoadData()
38 {
39 string str = Request.Params["JsonStr"];
40 DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Model.User));
41 MemoryStream ms=new MemoryStream(System.Text.Encoding.UTF8.GetBytes(str.ToCharArray()));
42 Model.User user = (Model.User)serializer.ReadObject(ms);
43 ms.Close();
44 }
45 /// <summary>
46 /// 向客户端发送数据
47 /// </summary>
48 private void GetData()
49 {
50 Model.User user = new Model.User();
51 user.Address = "上海市闵行区";
52 user.Age = 26;
53 user.Name = "Windstore";
54 string resultStr;
55 //方式一:System.Runtime.Serialization.Json Assembly:System.ServiceModel.Web
56 DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(Model.User));
57 MemoryStream stream = new MemoryStream();
58 serializer.WriteObject(stream, user);
59 stream.Position = 0;
60 StreamReader sr = new StreamReader(stream);
61 resultStr = sr.ReadToEnd();
62 sr.Close();
63 stream.Close();
64 //方式二:System.ServiceModel.Dispatcher.JsonQueryStringConverter Assembly:System.ServiceModel
65 //JsonQueryStringConverter convert = new JsonQueryStringConverter();
66 //resultStr = convert.ConvertValueToString(user, typeof(Model.User));
67 //方式三:System.Web.Script.Serialization
68 //StringBuilder sb = new StringBuilder();
69 //JavaScriptSerializer jsServilizer = new JavaScriptSerializer();
70 //jsServilizer.Serialize(user, sb);
71 //resultStr = sb.ToString();
72 Response.ContentType = "application/json";
73 Response.Write(resultStr);
74 Response.Flush();
75 Response.End();
76 }
77 }
78 }
79
Model类:
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Runtime.Serialization;
6 namespace WebDemo.Model
7 {
8 /// <summary>
9 /// 用户实体
10 /// </summary>
11 [DataContract]
12 public class User
13 {
14 #region 私有字段
15 private string named;
16 private string addressd;
17 private int aged;
18 #endregion
19 #region 公共属性
20 /// <summary>
21 /// 姓名
22 /// </summary>
23 [DataMember]
24 public string Name
25 {
26 get { return named; }
27 set { named = value; }
28 }
29
30 /// <summary>
31 /// 家庭住址
32 /// </summary>
33 [DataMember]
34 public string Address
35 {
36 get { return addressd; }
37 set { addressd = value; }
38 }
39
40 /// <summary>
41 /// 年龄
42 /// </summary>
43 [DataMember]
44 public int Age
45 {
46 get { return aged; }
47 set { aged = value; }
48 }
49 #endregion
50 }
51 }
客户端用JSON.stringify()反序列化的时候,默认的值都是字符串类型的,如果想返回整型值,可以用 JSON.stringify(myObject, replacer);用回调函数replacer处理。