ServiceStack.Redis.Core存在转义字符\“的Bug

Bug描述

如使用ServiceStack.Redis.Core(5.11.0)存储字符串:"{\"a\":"test"}",正常情况应有存储的值是{"a":"test"},可是ServiceStack存储的结果是:"{\"a\":"test"}",它把双引号和转义符也当作值存储到了Redis。

问题所在


private static byte[] ToBytes<T>(T value)
{
    var bytesValue = value as byte[];
    if (bytesValue == null && (numericTypes.ContainsKey(typeof(T)) || !Equals(value, default(T))))
        //问题出在ToJson上,程序没有判断数据类型全部做了json序列化!
        bytesValue = value.ToJson().ToUtf8Bytes();
    return bytesValue;
}

代码修改为如下


private static byte[] ToBytes<T>(T value)
{
    var bytesValue = value as byte[];
    if (bytesValue == null && (numericTypes.ContainsKey(typeof(T)) || !Equals(value, default(T))))
        //值类型和string类型不使用ToJson(string是引用类型)
        if (value.GetType().IsValueType || value.GetType().Name=="String")
        {
            bytesValue = value.ToString().ToUtf8Bytes();
        }
        else
        {
            bytesValue = value.ToJson().ToUtf8Bytes();
        }
    return bytesValue;
}

 修改后完美解决,记得去github上下载源代码才能修改!

修改读取方法:

不修改读取的字符串会丢失引号

//此方法在RedisClient.ICacheClient.cs中
public T Get<T>(string key)
{
    //原代码
    //return Exec(r =>
    //    typeof(T) == typeof(byte[])
    //        ? (T)(object)r.Get(key)
    //        :  JsonSerializer.DeserializeFromString<T>(r.GetValue(key))
    //);

    //修改后
    return Exec(r =>
        typeof(T) == typeof(byte[])
            ? (T)(object)r.Get(key):
            typeof(T).Name == "String"? (T)(object)r.GetValue(key) :
            JsonSerializer.DeserializeFromString<T>(r.GetValue(key))
    );
}

—完—

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值