我尝试使用ServiceStack将对象添加到redis哈希。但是,当我尝试发送到redis hash的对象之一具有null属性时,它会中断,将 String引用设置为未设置为String的实例 例外。
有人能指出正确的方法来做我想做的事情吗?在这种情况下, 将对象存储为redis哈希,同时将某些属性设置为null。 < / p>
以下是显示问题的摘录:
public interface SomeInterface
{
string Id {get;set;}
string Name {get;set;}
DateTime? DateScheduled {get;set;}
DateTime? DateUnscheduled {get;set;}
ISomeInterface SomeNeededObject {get;set};
}
public class SomeClass : SomeInterface
{
public string Id {get;set;
public string Name {get;set;}
public DateTime? DateScheduled {get;set;}
public DateTime? DateUnscheduled {get;set;}
public ISomeInterface SomeNeededObject {get;set};
// Other useful properties/methods
}
public class SomeService :Service
{
public void SomeMethod( ISomeInterface objectToSendToHash)
{
SomeClass c = new SomeClass()
{
Id = "1",
Name = "Name1",
DateScheduled = DateTime.Now
}; // creates a SomeClass with DateUnscheduled and SomeNeededObject properties set to null
using (IRedisClient redisClient = this.MyRedisClient)
{
var redis = redisClient.As<ISomeInterface>();
redis.StoreAsHash(objectToSendToHash); //throws exception because either DateUnscheduled, or SomeNeededObject properties are null!
}
}
}
答案 0 :(得分:1)
首先,您应该avoid using interfaces on DTO's这是序列化过程中常见问题的根源。
此外,StoreAsHash
API会将您的类型转换为键/值字典,并将每个属性存储在redis哈希中,这样您就只能使用基本的Poco类型(即不使用嵌套的复杂类型)。
我已经清理了您的源代码示例以删除所有命名和语法错误,以下示例确实按预期工作:
public interface ISomeInterface
{
string Id { get; set; }
string Name { get; set; }
DateTime? DateScheduled { get; set; }
DateTime? DateUnscheduled { get; set; }
ISomeInterface SomeNeededObject { get; set; }
}
public class SomeClass : ISomeInterface
{
public string Id { get; set; }
public string Name { get; set; }
public DateTime? DateScheduled { get; set; }
public DateTime? DateUnscheduled { get; set; }
public ISomeInterface SomeNeededObject { get; set; }
}
var c = new SomeClass
{
Id = "1",
Name = "Name1",
DateScheduled = DateTime.Now,
};
Redis.StoreAsHash(c);
var fromHash = Redis.GetFromHash<SomeClass>("1");
fromHash.PrintDump();
请注意,我们没有理由使用Typed RedisClient来使用StoreAsHash
,即
var redis = redisClient.As<ISomeInterface>();
使用错误的类型,即SomeClass
vs ISomeInterface
也是如此。
RedisClient上也提供StoreAsHash
API,例如:
redisClient.StoreAsHash(objectToSendToHash);