2016-06-22 7 views
2

私は、オブジェクトをRedisに格納する例があります。RedisTypedClient(ServiceStack Redis)で複合型を使用する

class CyPoint 
    { 
     // Fields... 
     private bool _Done; 
     private string _Color; 
     private string _Position; 
     private long _Id; 

     public long Id 
     { 
      get { return _Id; } 
      set 
      { 
       _Id = value; 
      } 
     } 

     public string Position 
     { 
      get { return _Position; } 
      set 
      { 
       _Position = value; 
      } 
     } 

     public string Color 
     { 
      get { return _Color; } 
      set 
      { 
       _Color = value; 
      } 
     } 

     public bool Done 
     { 
      get { return _Done; } 
      set 
      { 
       _Done = value; 
      } 
     } 

    } 

私は、文字列を格納していますので、これが動作するデータ

var redisCyPoint = redis.As<CyPoint>(); 
      var cpt = new CyPoint 
      { 
       Id = redisCyPoint.GetNextSequence(), 
       Position = "new Vector3(200, 300, 0)", 
       Color = "new Vector3(.5f, .7f, .3f)", 
      }; 

      redisCyPoint.Store(cpt); 

を保存するために、このコードを使用しています。しかし、位置と色をVector3(float、float、float)に変更すると、0だけが保存されます。ストアは複雑なタイプでは動作しないようです。これは制限事項ですか、これを行う方法はありますか?

答えて

1

構造体は、ToString()によって返されるserialized as a single scalar string valueです。 ToString()値から自身を取り込むことができるコンストラクタVector3(string)を実装するか、またはスタティックParseJson(string)メソッドを実装することによって、custom support for Structsを実装できます。

そうでなければ、あなたが例えば、シリアライズを処理するためのカスタム・シリアライザを指定することができます。

JsConfig<Vector3>.SerializeFn = v => "{0},{1},{2}".Fmt(v.X,v.Y,v.Z); 
JsConfig<Vector3>.DeSerializeFn = s => { 
    var parts = s.Split(','); 
    return new Vector3(parts[0],parts[1],parts[2]); 
}; 
関連する問題