servicestack redis get结构始终返回默认值

bogh5gae  于 2021-06-10  发布在  Redis
关注(0)|答案(2)|浏览(461)

我正在使用servicestack redis。我有一个 struct 我想把它储存在redis里。但是当我尝试获取它时,它总是返回默认值。但如果我改变了主意 struct 为了 class 工作正常。有什么想法吗?

public struct PersonStruct
{
    public string Name { get; set; }
    public int Year { get; set; }
}

单元测试(它总是通过,因为redis返回结构的默认值)

var obj = new PersonStruct() {Name = "SomeName", Year = 1235};
_redis.Set(key, obj, TimeSpan.FromMinutes(2));
var result = _redis.Get<PersonStruct>(key);

Assert.AreEqual(default(PersonStruct), result);
rqmkfv5c

rqmkfv5c1#

对于结构,必须使用自定义序列化程序/反序列化程序

var obj = new PersonStruct() {Name = "SomeName", Year = 1235};
var bytes = Encoding.UTF8.GetBytes(JsonSerializer.Serialize(obj));

_redis.Set(key, bytes, TimeSpan.FromMinutes(2));

var getBytes = _redis.Get(key);
var result = JsonSerializer.Deserialize<PersonStruct>(Encoding.UTF8.GetString(getBytes));

似乎是通过调用 ToString()

fcwjkofz

fcwjkofz2#

与struct的区别在于,它们被视为单个标量值,而不是序列化结构值的每个属性,例如date、day、dayofweek、dayofyear、hour等对于datetime,只序列化datetime、timespan等的单个标量值。
servicestack.text序列化程序按约定执行此操作,它将尝试在其中使用 ToString() 序列化为单个字符串值 TStruct(string) 构造函数来反序列化值。或者,您可以使用静态 ParseJson() 方法。
因此,如果要反序列化结构,则需要通过重写 ToString() 并提供一个字符串构造函数,例如:

public struct PersonStruct
{
    public PersonStruct(string jsonStr)
    {
        var str = jsonStr.FromJson<string>();
        Year = int.Parse(str.LeftPart(','));
        Name = str.RightPart(',');
    }

    public string Name { get; set; }
    public int Year { get; set; }

    public override string ToString() => Year + "," + Name;
}

然后您就可以在servicestack.redis类型的api中使用它,如这个gistlyn示例所示。

相关问题