2017-02-11 4 views
0

私はredis cashのハッシュに複雑なオブジェクトを格納する必要があります。これを行うにはstackexchange.redisを使用しています。私のクラスは以下のようです。 Redisの中にデータを格納するC#で赤色のハッシュで複雑なオブジェクトを保存する方法は?

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

私のコードスニペットは、次のとおりです。

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の中のデータを保存することができます:

db.HashSet("Red:10000",comapny.ToHashEntries()); 

// SerializeをRedisの形式で私は下の画像に示すような結果を得ています。 result after saving data in redis desktop manager 私はUserListの値をjson形式にしたいと思います。どうすればいいですか?

+0

あなたは(HTTPS [CachingFramework.Redis]試みることができる:// githubの.com/thepirat000/CachingFramework.Redis)は、設定可能なシリアライゼーションメカニズムのような拡張機能を備えたSE.Redisのラッパーです。 – thepirat000

答えて

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

シリアル化に問題があるようです。 JSONや.NETオブジェクトとの間の変換の最良の方法は、JsonSerializerを使用している:

JsonConvert.SerializeObject(fooObject); 

あなたはSerializing and Deserializing JSONから詳細を見ることができます。

また、ServiceStack.Redisの一部であるIRedisTypedClientを使用することもできます。

IRedisTypedClient - 任意のC#型に対して適用するために、すべてのRedisの値の操作 を作るためのサービススタックのC#のRedisのクライアントで 利用できるAPI「強く型付けされた」ハイレベル。すべての複合型はServiceStack JsonSerializerを使用して をJSONに透過的にシリアライズしています。 最も速いJSONシリアライザfor .NET。

これが役に立ちます。

+0

SE.Redisについてのこの質問はありませんか? –

+0

@MatíasFidemraizer申し訳ありませんが、私は自分の答えを更新しました。シリアライズには何か問題があり、Json.NETを使用するには良い方法です。 – McGrady

関連する問題