JSON:C#与JS中的序列化与反序列化

来源:互联网 发布:python web开发框架 编辑:程序博客网 时间:2024/06/14 04:26

        在Web项目中,序列化和反序列化是经常涉及到的话题,而很多人对JSON的理解也存在偏差,本文将从C#和JS的序列化和反序列化以及JSON的意义三个方面来讲述。

      什么是序列化?序列化就是某一时刻“活动”对象的快照,将对象一瞬间的状态记录下来。序列化不外乎两个目的,传输和持久化。比如我想将内存中的一个对象保存到文本文件中,就通过某些手段获取对象的当前状态其实也就是对象成员的值,以文本或者二进制保存到内存或者外存上。反序列化的工作正好相反,是将已经“扁平化"的对象的值重新填充到新实例中。

      在Web应用中,应用的最普遍的是将对象序列化成一段描述自身的文本。

      1、C#中的序列化和反序列化

       简单的序列化如下,我使用JSON.NET库来进行操作。

<span style="font-size:12px;"> class Program    {        static void Main(string[] args)        {            Person person = new Person() { Name = "echo", Age = 30 };            Console.WriteLine(JsonConvert.SerializeObject(person));            //output: { "Name" : "echo", "Age":30 }            Console.ReadLine();        }    }    class Person    {        public string Name;        public int Age;    }</span>

输出结果: { "Name" : "echo", "Age":30 }

            反序列化代码如下

<span style="font-size:12px;"><span style="font-size:14px;"> class Program    {        static void Main(string[] args)        {            string obj="{\"Name\" : \"echo\", \"Age\":30 }";            Person person = JsonConvert.DeserializeObject<Person>(obj);            Console.WriteLine("Name:"+person.Name+",Age:"+person.Age);            Console.ReadLine();        }    }    class Person    {        public string Name;        public int Age;    }</span></span>

       2、JavaScript中的序列化和反序列化

       JavaScript可能是这个世界上被误解最深的一种语言,就算在高级语言里来说,它也是相当复杂的一门语言。基于原型的继承、闭包等特性一点都不比C#简单。因为不屑于学习而导致的误解和滥用在前端开发领域是在是太多了,Jquery要为此负上很大一部分责任,Jquery不是JavaScript。

       C#或者JAVA中的序列化尚可理解,js中其实也有序列化和反序列化,许多人天天自觉或者不自觉的在用,但是可能并不明晰这个概念。我依旧用一个小例子来说明,不好意思此处用到了json2.js和jquery。鄙视这真是一个插件的世界....

       序列化对象:

 var o_Person = {};                o_Person.name = 'echo';                o_Person.age = 30;                alert(JSON.stringify(o_Person));
   输出结果: { "Name" : "echo", "Age":30 }

     反序列化对象:

     此处就是很多人一直纠结的所谓JSON的问题,其实JS中并不存在JSON,JS里面只有对象、数组、字符串、数字等基本类型。请看下面这段代码:

 var a_test = [], o_name = {}, o_age = {};                o_name.name = 'echo';                o_age.age = 30;                a_test.push(o_name);                a_test.push(o_age);                alert(JSON.stringify(a_test));

 输出:[ {"name":"echo"},{"age":30}] 

     此时,你难道能说a_test是一个所谓的JSON对象吗?no no,它就是一个数组而已,数组里装了两个对象,仅此而已。我们再来看下面一段代码:

 var s_array = '[{"name":"echo"},{"age":30}]';                var o_name = s_array[0];//第一个字符                var o_age = s_array[1];//第二个字符                alert(typeof (s_array));                alert(typeof (o_name));                alert(typeof (o_age));
     会发现就算我们把一个JSON文本赋给一个变量,这个变量依旧是个文本,而不会自动的变成一个JS数组或对象。这就是引起迷惑的地方。有的人说我发送参数的时候写JSON文本和对象都可以,确实可以,因为很多工作jquery悄悄的替你完成了。要让
'[{"name":"echo"},{"age":30}]'
    变成一个数组,其实就是JS中的反序列化。 代码如下:
  var s_array = '[{"name":"echo"},{"age":30}]';                var a_array = $.parseJSON(s_array);                var o_name = a_array[0];//第一个对象                var o_age = a_array[1];//第二个对象                alert(typeof (a_array));                alert(typeof (o_name));                alert(typeof (o_age));                alert(o_name.name);                alert(o_age.age);
      此处使用的是jquery的方法,你用别的插件或者自己写方法都是可以的。此处JSON文本被成功的反序列化成了对象,所有的属性都读了出来。

     上述就是JS中的序列化和反序列化。

    3、JSON的意义

     不知道大家发现没有,在C#和JS中相同的对象被序列化后产生的字符串是一样的。而借由一样的对象表示字符串反序列化而成的对象也是一样的。这真的是巧合吗?绝对不是!这是大家约定好的!

     不论是XML还是JSON,其根本目的都是为了解决异构通信问题,比如C#和JS,两种不同的语言,只能通过文本来相互交换数据。JSON除了解决了XML冗余过多及解析复杂的问题外,最重大的创新是以一种更贴近编程语言的方式去描述数据。

    百度上对JSON定义如下:JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。JSON采用完全独立于语言的文本格式。

    所以JSON说到底是一种协议。这种协议借由文本格式来实现。不论是C#还是JavaScript里面,都不存在所谓JSON对象。

    有人或许要问:

'[{"name":"echo"},{"age":30}]';
     这段文本为什么能转换成对象,呵呵,这种文本格式在js里面有个名字:叫对象字面量表示法,和C#中的对象初始化器像不像?大笑

     总结:

    通过上述机制,可以很容易的将C#中的一个类序列化后传输到JS中再原地满血复活。同样的,JS中的序列化字符串也可以在C#中被反序列化,特别是借助linq to sql,EF等ORM框架的帮助,数据传输变得无比简单明了。

 














     



1 0
原创粉丝点击