• 对象序列化成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比较强。

  • 相关阅读:
    9.11练习:文件访问,写一个逐页显示文本文件的程序,提示输入一个文件名,每次显示文本文件的25行,暂停并向用户提示“按任意键继续”,按键后继续执行。
    关于将缓冲器内容写入文件
    关于移动文件指针
    关于file.writelines换行符的添加
    石头剪子布游戏
    关于浅拷贝,深拷贝
    关于list.extend(iterable)
    vs2012编译openssl
    Sublime Text 3 安装及插件推荐
    bower--包管理工具
  • 原文地址:https://www.cnblogs.com/allonzh/p/3303580.html
Copyright © 2020-2023  润新知