ServiceStack Redis 总是获取一个结构 return 默认

ServiceStack Redis Get an struct always return default

我正在使用 ServiceStack Redis。我有一个 struct,我想将它存储在 Redis 中。但是当我尝试获取它时,它总是 return 默认值。 但是,如果我将 struct 更改为 class,它就可以正常工作。有什么想法吗?

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

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

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);

对于结构你必须使用自定义 serializer/deserializer

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()

序列化结构

与 Struct 的不同之处在于它们 treated like a single scalar value, where instead of serializing every property of a struct value, e.g. Date, Day, DayOfWeek, DayOfYear, Hour, etc 在 DateTime 的情况下,只有一个标量值被序列化为 DateTime、TimeSpan 等

ServiceStack.Text serializers does this by convention 它将尝试使用 ToString() 序列化为单个字符串值,并使用 TStruct(string) 构造函数反序列化该值。或者,您可以使用静态 ParseJson() 方法提供自己的反序列化器函数。

因此,如果您想反序列化结构,则需要通过覆盖 ToString() 并提供字符串构造函数来为您的结构提供 serializer/deserializer,例如:

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 example gist.

中所示