解决了json反序列化的效率问题。

原先的测试不全面,发觉class结构一复杂,反序列化时分析json string出现了严重的效率问题。
多方求助也没有解决。
其间试了很多人的json实现(官方的两个,google到的一个,teddy的nbear里的)。
都有这个问题。

后来,一点点排查,先从一个最简单的json字符串开始,逐渐往里面加属性测试。
最后发觉当我加入 "a":1.01 时速度很慢,而 "a":1 时速度正常。

然后才定位到问题所在:

官方代码:
      if ((b >= '0' && b <= '9') || b == '.' || b == '-' || b == '+')
            {
                try
                {
                    return Convert.ToInt32(s);
                }
                catch (Exception e)
                {
                    string msg = e.Message;
                }
                try
                {
                    return Convert.ToDouble(s, NumberFormatInfo.InvariantInfo);
                }
                catch (Exception e)
                {
                    string msg = e.Message;
                }
            }
            
这段代码在c#里面会有严重的效率问题。
应该是C#的异常机制不完善造成的!
在java里,利用异常做这种工作对效率没有任何影响,(当然,也不提倡这么写,偷懒的行为)。

把这段代码转换成
      if ((b >= '0' && b <= '9') || b == '.' || b == '-' || b == '+')
            {
                if (s.Contains("."))
                    return Convert.ToDouble(s, NumberFormatInfo.InvariantInfo);
                else
                {
                    long tmp = Convert.ToInt64(s);
                    if (tmp > Int32.MaxValue || tmp < Int32.MinValue)
                        return tmp;
                    return Convert.ToInt32(tmp);
                }
            }
           
问题解决。


速度提高50倍。

另外,用dynamic method调用代替了反射,也提高了序列化/反序列化bean的性能。  

.

转载于:https://www.cnblogs.com/yang-peng/archive/2006/07/05/443025.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
我不确定您的问题的完整上下文和要求,但是我会尽力回答。 Spring Session是一个用于在分布式环境中管理用户会话的框架。它提供了一个抽象层,可以将用户会话存储在不同的后端存储中,如Redis、MongoDB等。 在Spring Session中,会话对象需要进行序列化和反序列化。默认情况下,Spring Session使用Java序列化来进行对象的序列化和反序列化。但是,Java序列化有许多问题,如效率低下、序列化后的数据过大、不利于跨语言等。 为了解决这些问题,Spring Session提供了一些替代方案,如JSON序列化、Kryo序列化等。您可以在Spring Boot应用程序的配置文件中配置所需的序列化器。 以下是一个使用JSON序列化器的示例配置: ``` spring: session: store-type: redis # 存储类型为Redis redis: flush-mode: on_save # 保存时刷新Redis serializer: json # 使用JSON序列化器 ``` 如果您使用Kryo序列化器,则可以使用以下配置: ``` spring: session: store-type: redis # 存储类型为Redis redis: flush-mode: on_save # 保存时刷新Redis serializer: kryo # 使用Kryo序列化器 kryo: registration-required: false # 不需要注册类 ``` 在上面的配置中,我们将存储类型设置为Redis,并使用JSON或Kryo序列化器。如果使用Kryo序列化器,则需要指定是否需要注册类。 希望这可以帮助您解决问题。如果您有任何进一步的问题或要求,请提供更多上下文信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值