如何在c#中的redis hash中存储复杂对象?

时间:2017-02-11 18:47:57

标签: c# redis stackexchange.redis

我必须将复杂的对象存储到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中但不是我想要的。我正在查找结果,如下图所示。 result after saving data in redis desktop manager 我想要json格式的UserList值。那么,我该怎么做呢。

2 个答案:

答案 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();
}