一、数据结构

[AVClassName("quick_review_word")]
public class QuickReviewWord : AVObject
{

    /// <summary>
    /// 出报告用的词条描述
    /// </summary>
    [AVFieldName("dict_bad_words")]
    public Dictionary<string, string> BadWords
    {
        get { return GetProperty<Dictionary<string, string>>("BadWords"); }
        set { SetProperty(value, "BadWords"); }
    }

}

一个的字典,使用SyncSave保存的

二、数据条目

确认存储成功

三、读取代码

    var query = new AVQuery<QuickReviewWord>().FindAsync().ContinueWith(t =>
    {
        //返回的结果进入任务池
        TYEvent.AddEvent(() =>
        {
            //如果没有初始化,
            if (t.IsCanceled || t.IsFaulted ||
             t.Result.Count() == 0)
            {
                TYUIManager.Ins.DiaLogWindow("还没有数据,请添加一个哟");
                return;
            }

            WordsData = t.Result.ToList();
            foreach (var data in WordsData)
            {
                //测试Log
                if (data.BadWords == null)
                {
                    Debug.LogError("奇怪");
                }
            }

“奇怪 ”会被打印出来,也就是无法读取到该字典,为Null,而不是空的字典。
这是我哪里操作没对?
Unity平台。

对于 Dictionary 类型的属性,请将「值类型」修改为 object(无论实际上是什么类型)。


[AVFieldName("dict_bad_words")] 
public Dictionary<string, object> BadWords
{
   get { return GetProperty<Dictionary<string, object>>("BadWords"); }
   set { SetProperty(value, "BadWords"); }
}

这个原因是由于在反序列化的过程中,由于需要提前实例化对象,而实例化时,是无法知晓值类型的「具体类型」,所以先以先构造 Dictonary 对象,在反序列化过程中,会根据具体类型的值做反序列化。

所以,可以在拿到这个属性之后,再对值做类型转化,如

foreach (var v in xx.BadWords) {
    string s = v as string;
    ....
}
1 人赞了这个帖子.