在RedisTypedClient中使用复杂类型(ServiceStack Redis)

时间:2016-06-22 19:03:44

标签: redis 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。似乎Store不适用于复杂类型。这是一个限制还是有办法做到这一点?

1 个答案:

答案 0 :(得分:1)

ToString()返回的结构是serialized as a single scalar string value。您可以通过实现可以从其Vector3(string)值填充自身的构造函数ToString()来实现custom support for Structs,或者实现静态ParseJson(string)方法。

否则,您可以指定自定义序列化程序来处理序列化,例如:

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