我必须将复杂的对象存储到redis cash的哈希中。我正在使用stackexchange.redis来执行此操作。我的类如下所示。
public class Company
{
public string CompanyName { get; set; }
public List<User> UserList { get; set; }
}
public class User
{
public string Firstname { get; set; }
public string Lastname { get; set; }
public string Twitter { get; set; }
public string Blog { get; set; }
}
我在redis中存储数据的代码段是:
db.HashSet("Red:10000",comapny.ToHashEntries());
//以Redis格式序列化:
public static HashEntry[] ToHashEntries(this object obj)
{
PropertyInfo[] properties = obj.GetType().GetProperties();
return properties
.Where(x => x.GetValue(obj) != null) // <-- PREVENT NullReferenceException
.Select(property => new HashEntry(property.Name, property.GetValue(obj)
.ToString())).ToArray();
}
我可以将数据存储在redis中但不是我想要的。我正在查找结果,如下图所示。
我想要json格式的UserList
值。那么,我该怎么做呢。
答案 0 :(得分:2)
序列化似乎有问题。在JSON和.NET对象之间进行转换的最佳方法是使用JsonSerializer:
JsonConvert.SerializeObject(fooObject);
您可以从Serializing and Deserializing JSON查看更多详情。
还有另一种好方法,你可以尝试使用IRedisTypedClient
,这是ServiceStack.Redis的一部分。
IRedisTypedClient - 高级&#39;强类型&#39; API可用 在Service Stack的C#Redis客户端上进行所有Redis Value操作 适用于任何c#类型。所有复杂类型都在哪里 使用ServiceStack JsonSerializer透明地序列化为JSON - 最快的JSON Serializer for .NET。
希望这有帮助。
答案 1 :(得分:2)
最简单的路径可能是检查每个属性值是否为集合(请参阅我修改后的方法中的注释):
public static HashEntry[] ToHashEntries(this object obj)
{
PropertyInfo[] properties = obj.GetType().GetProperties();
return properties
.Where(x => x.GetValue(obj) != null) // <-- PREVENT NullReferenceException
.Select
(
property =>
{
object propertyValue = property.GetValue(obj);
string hashValue;
// This will detect if given property value is
// enumerable, which is a good reason to serialize it
// as JSON!
if(propertyValue is IEnumerable<object>)
{
// So you use JSON.NET to serialize the property
// value as JSON
hashValue = JsonConvert.SerializeObject(propertyValue);
}
else
{
hashValue = propertyValue.ToString();
}
return new HashEntry(property.Name, hashValue);
}
)
.ToArray();
}