繁体   English   中英

C#如何将对象序列化/反序列化到/从字典<string,Object>在 Couchbase.lite 中保存/加载它

[英]C# How to serialize/deserialize an Object to/from Dictionary<string,Object> to save/load it in Couchbase.lite

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

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 文档,这个过程不是递归的,只是在我的对象字段和属性的第一级。

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

好的,这不是我问题的完整答案,但它暂时解决了问题。 我来到了将整个对象放入传递给 Couchbase.Lite 的 Dictionary 的解决方案:

    var c = new TestClass() {TestString = "SimpleStringfield", TestDate = DateTime.Today,TestStringProperty = "TestStringPropertyContent",
                              TestStringList = new List<string>(new string[] { "item1","item2","item3"})};


    var manager = Manager.SharedInstance;
    var db = manager.GetDatabase("test_database");
    if (db == null)
    {
        System.Diagnostics.Debug.WriteLine("--------------------------Could not open Database");
    }

    var doc = db.CreateDocument();
    var properties = new Dictionary<string,Object>() { {"type","day"}, {"day",c} };

    var rev = doc.PutProperties(properties);

    var docread = db.GetDocument(doc.Id);
    JObject testobject = (JObject)docread.GetProperty("day");

    var o = testobject.ToObject<TestClass>();
}

最后 o 包含与 c 相同的值。

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

我将始终断言“正确的方式”是有效的方式。 不过,该库在内部使用 JSON .NET 是一个实现细节。 如果由于某种原因而改变,那么这种方式就会中断。 我也有一种感觉,如果课程比您的示例更复杂,它也会中断。 我们目前正在设计一个跨平台规范来做你想做的事情(将类直接保存到数据库中,而无需先转换为字典)。 尽管这将是一个缓慢的过程,因为需要考虑很多(不仅对于 C#,对于 Java 和 Objective-C 也是如此)。 例如,如何序列化一个具有引用它的属性的类,等等。我知道 JSON .NET 已经这样做了,但我不想开始将 JSON .NET 暴露到公共 API 中,因为最终它应该是可切换(以防 JSON .NET 因某种原因在平台上不起作用)。

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

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}
        };
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM