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.
中所示
我正在使用 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.
中所示