.net性能优化之---ServiceStack.Text代替Newtonsoft.Json

测试代码(Nuget引入Newtonsoft.Json和ServiceStack.Text两个dll)

    public class People
    {
        public string Id { get; set; }
        public string Name { get; set; }
        public string Sex { get; set; }
        public string Phone { get; set; }
        public int Height { get; set; }
        public int Weight { get; set; }
    }

    class Program
    {
        static void Main()
        {
            TimerDeserialize(50000);
            TimerDeserialize(100000);
            TimerDeserialize(500000);
            TimerDeserialize(1000000);
            Console.ReadKey();
        }

        private static void TimerSerialize(int count)
        {
            var people = new People { Id = "1", Name = "测试", Sex = "男", Phone = "1546789712", Height = 170, Weight = 120 };
            Stopwatch jsonWatch = new Stopwatch();
            jsonWatch.Start();
            for (int i = 0; i < count; i++)
            {
                var jsonStr = Newtonsoft.Json.JsonConvert.SerializeObject(people);
            }
            jsonWatch.Stop();
            Console.WriteLine($"Newtonsoft.Json 序列化对象数量:{count},耗时:{jsonWatch.ElapsedMilliseconds} ms");

            Stopwatch stackWatch = new Stopwatch();
            stackWatch.Start();
            for (int i = 0; i < count; i++)
            {
                var jsonStr = ServiceStack.Text.JsonSerializer.SerializeToString(people);
            }
            
            stackWatch.Stop();
            Console.WriteLine($"ServiceStack.Text 序列化对象数量:{count},耗时:{stackWatch.ElapsedMilliseconds} ms");
        }

        private static void TimerDeserialize(int count)
        {
            var jsonStr = "{ \"Id\":\"1\",\"Name\":\"测试\",\"Sex\":\"男\",\"Phone\":\"1546789712\",\"Height\":170,\"Weight\":120,\"cars\":[{\"Color\":\"White\",\"Price\":483924028.00,\"BuyDate\":\"2019-04-03T13:31:36.1883973+08:00\"}]}";

            Stopwatch jsonWatch = new Stopwatch();
            jsonWatch.Start();
            for (int i = 0; i < count; i++)
            {
                var jsonObject = Newtonsoft.Json.JsonConvert.DeserializeObject<People>(jsonStr);
            }
            jsonWatch.Stop();
            Console.WriteLine($"Newtonsoft.Json 反序列化对象数量:{count},耗时:{jsonWatch.ElapsedMilliseconds} ms");
            Stopwatch stackWatch = new Stopwatch();
            stackWatch.Start();
            for (int i = 0; i < count; i++)
            {
                var stackOjbect = ServiceStack.Text.JsonSerializer.DeserializeFromString<People>(jsonStr);
            }
            stackWatch.Stop();
            Console.WriteLine($"ServiceStack.Text 反序列化对象数量:{count},耗时:{stackWatch.ElapsedMilliseconds} ms");
        }
    }

结果:

在大数据的情况下,ServiceStack.Text反序列化是Newtonsoft.Json的两倍左右。序列化相差不大。

现在ServiceStack.Text是收费的了还好是开源,看到了有文章写的可以接触配额限制,转载过来

原文地址:http://blog.csdn.net/hao_ds/article/details/73648130

ServiceStack 4.0 开始已经成为商业产品,不再完全免费,好在是开源的,主要限制免费配额功能在ServiceStack.Text类库下的LicenseUtils.cs文件中,仅需从GitHub上下载源码后添加一行代码重新编译即可解除限制,如下图:

注意事项:

扫描二维码关注公众号,回复: 10392493 查看本文章

在使用ServiceStack.Text的序列化为json格式的时候,当属性为datetime的时候,返回的是一个new date(324234234)的字符串,如果想返回yyyy-MM-dd HH:mm:ss格式的日期,需要修改源码,在jsconfig.cs加入以下代码:

private static bool dMsDatetimeFormat=true;
 
      public static bool MsDatetimeFormat
      {
          get { return dMsDatetimeFormat; }
          set { dMsDatetimeFormat = value; }
      }

这是用来标示是否转化为刚才看到的那种自定义的格式。

接着 修改DateTimeSerializer.cs文件的   public static void WriteWcfJsonDate(TextWriter writer, DateTime dateTime)方法

修改后的代码如下

public static void WriteWcfJsonDate(TextWriter writer, DateTime dateTime)
    {
        if (JsConfig.AssumeUtc && dateTime.Kind == DateTimeKind.Unspecified)
        {
            dateTime = DateTime.SpecifyKind(dateTime, DateTimeKind.Utc);
        }
 
        if (JsConfig.DateHandler == DateHandler.ISO8601)
        {
            writer.Write(dateTime.ToString("o", CultureInfo.InvariantCulture));
            return;
        }
 
        if (JsConfig.DateHandler == DateHandler.RFC1123)
        {
            writer.Write(dateTime.ToUniversalTime().ToString("R", CultureInfo.InvariantCulture));
            return;
        }
 
        var timestamp = dateTime.ToUnixTimeMs();
        string offset = null;
        if (dateTime.Kind != DateTimeKind.Utc)
        {
            if (JsConfig.DateHandler == DateHandler.TimestampOffset && dateTime.Kind == DateTimeKind.Unspecified)
                offset = UnspecifiedOffset;
            else
                offset = LocalTimeZone.GetUtcOffset(dateTime).ToTimeOffsetString();
        }
        else
        {
            // Normally the JsonDateHandler.TimestampOffset doesn't append an offset for Utc dates, but if
            // the JsConfig.AppendUtcOffset is set then we will
            if (JsConfig.DateHandler == DateHandler.TimestampOffset && JsConfig.AppendUtcOffset.HasValue && JsConfig.AppendUtcOffset.Value)
                offset = UtcOffset;
        }
 
        if (JsConfig.MsDatetimeFormat)
        {
            writer.Write(dateTime.ToString("yyyy-MM-dd hh:mm:ss"));
        }
        else
        {
 
            writer.Write(EscapedWcfJsonPrefix);
            writer.Write(timestamp);
            if (offset != null)
            {
                writer.Write(offset);
            }
            writer.Write(EscapedWcfJsonSuffix);
        }
 
 
    }

这样再使用序列化方法的时候返回的就是’2015-09-08  11:11:11’的格式了

当你不想用的时候,想恢复默认的方式,只要序列化前用这句就行了

ServiceStack.Text.JsConfig.MsDatetimeFormat = false;

原文地址:http://blog.sina.com.cn/s/blog_53a04e6c0102wh6s.html

发布了37 篇原创文章 · 获赞 3 · 访问量 6328

猜你喜欢

转载自blog.csdn.net/huan13479195089/article/details/88993539