【原】JavaScriptSerializer类的序列化和反序列化操作

JavaScriptSerializer类为启用AJAX的应用程序提供序列化和反序列化的功能(MSDN原版:Provides serialization and deserialization functionality for AJAX-enabled applications.)深深的鄙视一下MSDN中文版的翻译(赫然写着"为启用 AFAX 的应用程序提供序列化和反序列化功能。",抓破头也没查出AFAX是个啥)

使用时需要引入命名空间:

using System.Web.Script.Serialization;

最常用的几个方法:

1)Deserialize(String, Type)    将 JSON 格式字符串转换为指定类型的对象。
2)Deserialize<T>(String)    将指定的 JSON 字符串转换为 T 类型的对象。
3)Serialize(Object)    将对象转换为 JSON 字符串。

下面结合一个例子来说明这个类的用法(代码中有注释,就不再说明了):

1)首先编写一个实体类

using System;
using System.Web.Script.Serialization;

namespace JavaScriptSerializerDemo
{
    /// <summary>
    /// 不论类是否使用[Serializable]特性,只要属性使用[ScriptIgnore]特性,则该属性不能被序列化
    /// </summary>
    [Serializable]
    public class User
    {
        public int UserID { get; set; }
        
        //[ScriptIgnore]
        public string UserName { get; set; }
    }
}

2)接着编写模拟数据

/// <summary>
/// 模拟单个实体
/// </summary>
/// <returns></returns>
private User MockSingleData()
{
    var user = new User { UserID = 1, UserName = "洪自军" };
    return user;
}

/// <summary>
/// 模拟实体集合
/// </summary>
/// <returns></returns>
private List<User> MockListData()
{
    var list = new List<User>
    {
        new User { UserID = 1, UserName = "张洋" },
        new User { UserID = 2, UserName = "张兄家" },
        new User { UserID = 3, UserName = "王生杰" },
        new User { UserID = 4, UserName = "叶宇" }
    };

    return list;
}

/// <summary>
/// 模拟测试实体集合(集合中有50000个实体)
/// </summary>
/// <returns></returns>
private object MockTestData()
{
    var list = new List<User>();

    for (int i = 0; i < 50000; i++)
    {
        list.Add(new User { UserID = i, UserName = "测试姓名_" + i });
    }

    return list;
}

3)然后编写序列化和反序列化数据的处理代码

/// <summary>
/// 页面初始化
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        JavaScriptSerializer ser = new JavaScriptSerializer();

        Response.Write("1)序列化取得单个实体的JSON字符串:<br/>");
        Response.Write(ser.Serialize(MockSingleData()));

        Response.Write("<hr/>");

        User user = ser.Deserialize<User>(ser.Serialize(MockSingleData()));
        Response.Write("2)反序列化取得JSON字符串对应的单个实体:<br/>");
        Response.Write(user.UserID + "<br/>" + user.UserName);

        Response.Write("<hr/>");

        Response.Write("3)序列化取得实体集合的JSON字符串:<br/>");
        Response.Write(ser.Serialize(MockListData()));

        Response.Write("<hr/>");

        TimeSpan tsStart = new TimeSpan(DateTime.Now.Day, DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second, DateTime.Now.Millisecond);

        Response.Write("4)序列化取得测试实体集合(数量50000个实体)的JSON字符串:<br/>");
        ser.Serialize(MockTestData());

        TimeSpan tsEnd = new TimeSpan(DateTime.Now.Day, DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second, DateTime.Now.Millisecond);
        
        TimeSpan ts = tsStart.Subtract(tsEnd).Duration();
        Response.Write(string.Format("使用JavaScriptSerializer变换耗时:{0}", ts.ToString()));

    }
}

4)运行效果如图所示

posted @ 2013-05-21 00:11  {name:"代码屠夫"}  阅读(2295)  评论(1编辑  收藏  举报