C#如何将对象序列化/反序列化为Dictionary <string,object>以在Couchbase.lite中保存/加载它

时间:2016-03-23 12:21:37

标签: c# serialization deserialization couchbase couchbase-lite

如果我想将数据存储为Clouchbase.lite中的Document,则必须采用字典形式,如下所示:

var properties = new Dictionary<string, object>()
    {
        {"type", "list"},
        {"title", "title"},
        {"created_at", DateTime.UtcNow.ToString ("o")},
        {"owner", "profile:" + userId},
        {"members", new List<string>()}
    };
var rev = document.PutProperties(properties);

如何从任何C#对象自动创建这样的字典? 如果我理解couchbase.lite文档,那么这个过程不是递归的,只是在我的对象字段和属性的第一层。

如何从这样的字典中重新创建对象?

2 个答案:

答案 0 :(得分:1)

好的,这不是我问题的完整答案,但它现在解决了这个问题。我找到了将整个对象放入字典的解决方案,该字典被交给Couchbase.Lite:

X -- first select before update
----
A
B
C


X -- second select after update
----
D
D
D

---- select the variable value after update
D 

最后o包含与c。

相同的值

我想指出Jim Borden给我这种方法的警告:

  

我将始终坚持正确的方式&#34;是有效的方式。该   事实上,库内部使用JSON .NET是一种实现   但是,细节。如果由于某种原因改变那么这种方式   会打破。我也有一种感觉,如果班级更复杂   比你的例子还要破坏。我们正在   设计一个跨平台规范来做你想做的事   do(直接将类保存到数据库而不转换为   字典第一)。这将是一个缓慢的过程,因为有   需要考虑的很多想法(不仅仅是针对C#,而是针对   Java和Objective-C以及)。例如,如何序列化类   它有一个引用它的属性,等等。我知道JSON .NET   已经这样做了,但我不想开始公开JSON .NET   公共API,因为它最终应该是可切换的(以防万一)   JSON .NET在平台上无论出于何种原因都不起作用。)

答案 1 :(得分:0)

我知道你在谈论自动,但我需要暴露我的类的各个字段,以便我可以索引它们并运行映射查询。所以我指定了所有可查询的对象来跟随这个界面:

public interface IEntity
{
    string Id { get; set; }

    IDictionary<string, object> ToDictionary();
    void PopulateFrom(IDictionary<string, object> prop);

}

通常按如下方式实施:

public class Club : IEntity
{
    public string Id { get; set; }
    public string Name { get; set; }
    public string Country { get; set; }
    public string Place { get; set; }
    public long ClubId { get; set; }
    public string Access { get; set; } = "read";
    public List<ClubMember> Members { get; set; }

    public void PopulateFrom(IDictionary<string, object> prop)
    {
        Name = prop.GetOrDefault<string>("name");
        Country = prop.GetOrDefault<string>("country");
        Place = prop.GetOrDefault<string>("place");
        ClubId = prop.GetOrDefault<long>("club_id");
        Access = prop.GetOrDefault<string>("access");
        Members = ParseMembers(prop["members"]);
    }


    public IDictionary<string, object> ToDictionary()
    {

        return new Dictionary<string, object>
        {
            { "club_id", ClubId },
            { "name", Name },
            { "country", Country },
            { "place", Place },
            { "access", Access },
            { "members", Members}
        };
    }

}