ProtoBuff.net令人讨厌的行为是将空集合序列化为null
。这可以创建一些非常难以确定的错误。
使用以下函数从我的应用程序中检索缓存值:
public T Get<T>(string cacheKey)
{
var data = (byte[])Database.StringGet(cacheKey);
if (data == null)
{
return default(T);
}
return Serialiser.Deserialise<T>(data);
}
如果T
为List<int>
且值为零,则会返回一个空列表(因为data == null
它将返回default(List<int>)
)。
如果T
为Dictionary<bool, Hashset<int>
,其中存在两个密钥true
和false
,但相应的哈希集中没有值,则密钥存在,但值为{{ 1}}。
有没有办法确定null
是否包含集合,如果是,则返回空集合而不是null如果集合为空?优选地,它将在对象中的任何地方检查空集合,而不仅仅是T本身是包含集合的集合。
另一种选择(我现在正在做的)是当我从缓存中获取非常理想的时候知道显式类型时,尝试记住检查空值。
答案 0 :(得分:1)
您可以使用typeof运算符。
if(typeof(T)== typeof(Dictioneary))
{
return whatever you want;
}
答案 1 :(得分:0)
根据我的评论,会有这样的帮助吗?
void Main()
{
Get<int>("cacheKey1").Dump();
Get<List<string>, string>("cacheKey2").Dump();
Get<Dictionary<string, string>, KeyValuePair<string,string>>("cacheKey3").Dump();
}
public T Get<T>(string cacheKey)
{
...
return default(T);
}
public IEnumerable<S> Get<T, S>(string cacheKey) where T : IEnumerable<S>
{
...
return Enumerable.Empty<S>();
}