zoukankan      html  css  js  c++  java
  • 对象序列化成Json字符串 及 反序列化成对象

    一、       

            public static string JsonSerializer<T>(T t)
            {
                DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
                MemoryStream ms = new MemoryStream();
                ser.WriteObject(ms, t);
                string jsonString = Encoding.UTF8.GetString(ms.ToArray());
                ms.Close();
                return jsonString;
            }


            public static T JsonDeserialize<T>(string jsonString)
            {
                DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
                MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
                T obj = (T)ser.ReadObject(ms);
                return obj;
            }

       示例:      

    string jsonString = "[{"Key":"USD","Value":"美元"},{"Key":"GBP","Value":"英镑"},{"Key":"EUR","Value":"欧元"}]";
                DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Dictionary<string, string>));
                MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
                Dictionary<string, string> jsonDic = (Dictionary<string, string>)ser.ReadObject(ms);
                foreach (var item in jsonDic)
                {
                    Console.WriteLine("Key:{0}, Value:{1}", item.Key, item.Value);
                }

    注:

    1. 必须使用Framework4.0,

    2. 引用:

    using System.Runtime.Serialization;
    using System.Runtime.Serialization.Json;

    二、.net 自带反序列化:只针对一个对象,而不能是数组(如:Dictionary<string, string>)

    添加程序集:System.Web.Extensions

    using System.Web.Script.Serialization;

    public static T JsonDeserializeNet<T>(string jsonString)
    {
    JavaScriptSerializer ser = new JavaScriptSerializer();
    return ser.Deserialize<T>(jsonString);
    }

    public static string JsonSerializeNet<T>(T t)
    {
    JavaScriptSerializer ser = new JavaScriptSerializer();
    return ser.Serialize(t);
    }

    要对这三种方式分别作测试,必须要将相应的内库引用进来

    (1)JavaScriptSerializer这个类是.Net内置的,属于System.Web.Script.Serialization这个命名空间下面。需要引用System.Web.Extensions这个dll。

    (2)DataContract方式也是.net内置的,主要使用的DataContractJsonSerializer这个类,属于System.Runtime.Serialization.Json这个命名空间。需要引用System.Runtime.Serialization这个dll。

    (3)Newtonsoft.Json是第三方的dll,但是Visual Studio 对它做了很好的支持。使用方式有两种:一种是去网上下载最新的dll,然后添加引用即可;第二种是直接使用NuGet安装这个包。方式如下:

    测试总结:

    (1)总的来说,DataContract和Newtonsoft.Json这两种方式效率差别不大,随着数量的增加JavaScriptSerializer的效率相对来说会低些。

    (2)对于DataTable的序列化,如果要使用json数据通信,使用Newtonsoft.Json更合适,如果是用xml做持久化,使用DataContract合适。

    (3)随着数量的增加JavaScriptSerializer序列化效率越来越低,反序列化和其他两种相差不大。

    (4)后来发现当对象的DataTime类型属性不赋值时,DataContract和JavaScriptSerializer这两种方式序列化都会报错,而用Newtonsoft.Json方式可以正常序列化。所以看来在容错方便,还是Newtonsoft.Json比较强。

  • 相关阅读:
    【转】MySQL导入数据乱码的分析与解决
    查看MySQL的warning
    修改MySQL字符集
    【转】PHP乱码问题,UTF8(乱码)
    马哥Linux——第一周作业
    马哥Linux——第二周作业
    .Net内部运行过程
    Html那些事
    面向对象图解、类型转换图解,写给.Net新手
    javascript对于DOM加强
  • 原文地址:https://www.cnblogs.com/allonzh/p/3303580.html
Copyright © 2011-2022 走看看