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))
);
}
—完—