ServiceStack.Redis在缓存中存储空对象

本文关键字:存储 对象 缓存 Redis ServiceStack | 更新日期: 2023-09-27 18:20:25

我正试图为我的c#项目实现一个redis缓存。我使用了rediClient,它可以很好地存储普通的数据类型,如int和字符串,但不用于存储对象。然后我转到RedisTypedClient,它应该将我的对象存储在redis中,但它存储了一个空对象。当我尝试检索那个对象时,它会创建一个新对象并返回。

这是我的测试代码,我正试图让它发挥作用,但它不起作用。

internal class Test
{
    public int a;
    public int b;
    public string s;
    public void show()
    {
        Console.WriteLine(a + "  " + b + "  " + s);
    }
}
public class Program
{
    private static void Main(string[] args)
    {
        using (var redisClient = new RedisClient("localhost"))
        {
            var t = new List<Test>();
            t.Add(new Test {a = 1, b = 2});
            t.Add(new Test {a = 3, b = 4});
            var key = "e";
            var rtest = redisClient.As<Test>();
            rtest.Store(t[0]).show();
            Console.WriteLine(t[0].GetId());
            var q = rtest.GetById(t[0].GetId());
        }
        Console.ReadKey();
    }

我也尝试过使用redis列表。

IRedisList<Test> tl = rtest.Lists["testl"];
tl.Add(new Test { a = 1, b = 2 }); 
tl.Add(new Test { a = 3, b = 4 });
var rlist = rtest.Lists["testl"];

但同样的事情也发生在这种情况下。它存储空对象。

我刚开始重新打开窗户,可能是我犯了一些错误。但我无法让它发挥作用。任何帮助都将不胜感激。

ServiceStack.Redis在缓存中存储空对象

默认情况下ServiceStack.Text Serializer只存储公共属性,因此您需要将类中的字段转换为属性,例如:

internal class Test
{
    public int a { get; set; }
    public int b { get; set; }
    public string s { get; set; }
    public void show()
    {
        Console.WriteLine(a + "  " + b + "  " + s);
    }
}

或者,您可以将文本序列化程序更改为也使用序列化公共字段

JsConfig.IncludePublicFields = true;