Couchbase Lite 2 + JsonConvert

时间:2018-04-20 20:42:11

标签: c# json couchbase-lite servicestack-text

以下代码示例将一个简单对象写入couchbase lite(版本2)数据库,然后读取所有对象。您可以在官方文档here

中找到这些内容

这是非常多的手动输入,因为每个对象的每个属性都必须转移到MutableObject

class Program
{
    static void Main(string[] args)
    {
        Couchbase.Lite.Support.NetDesktop.Activate();

        const string DbName = "MyDb";
        var db = new Database(DbName);

        var item = new Item { Name = "test", Value = 5 };

        // Serialization HERE
        var doc = new MutableDocument();
        doc.SetString("Name", item.Name);
        doc.SetInt("Value", item.Value);
        db.Save(doc);

        using (var qry = QueryBuilder.Select(SelectResult.All())
                                     .From(DataSource.Database(db)))
        {
            foreach (var result in qry.Execute())
            {
                var resultItem = new Item
                {
                    // Deserialization HERE
                    Name = result[DbName].Dictionary.GetString("Name"),
                    Value = result[DbName].Dictionary.GetInt("Value")
                };

                Console.WriteLine(resultItem.Name);
            }
        }

        Console.ReadKey();
    }

    class Item
    {
        public string Name { get; set; }
        public int Value { get; set; }
    }
}

根据我的研究,Couchbase lite在内部使用JsonConvert,因此可能有一种方法可以在JsonConvert的帮助下简化所有这些。

像:

var json = JsonConvert.SerializeObject(item);
var doc = new MutableDocument(json); // No overload to provide raw JSON

或者

var data = JsonConvert.SerializeToDict(item); // JsonConvert does not provide this
var doc = new MutableDocument(data);

是否存在某种优化方式,首选方法是什么?

2 个答案:

答案 0 :(得分:1)

人们经常会问这个问题,但Couchbase Lite实际上并没有在数据库中存储JSON字符串。它们以不同的格式存储,因此不会产生您认为的好处(JSON需要重新分析,然后分解为其他格式)。我一直在推动一种直接序列化类的方法,而不是通过字典对象(这似乎是最终的目标),但我们的优先事项是企业客户想要的东西,这似乎不是一个他们请注意,要使其成为,需要在C#Java和Objective-C / Swift中实现。

答案 1 :(得分:0)

我不了解JsonConvert,但似乎有一个构造函数以IDictionary<string, object>为参数。所以我会尝试这样的事情(大脑编译):

MutableDocument CreateDocument(object data)
{
   if (data == null) return null;
   var propertyValues = new Dictionary<string, object>();
   foreach (var property in data.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance))
   {
       propertyValues[property.Name] = property.GetValue(data);
   }
   return new MutableDocument(propertyValues);
 }

看看是否有效。