如果我想将数据存储为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文档,那么这个过程不是递归的,只是在我的对象字段和属性的第一层。
如何从这样的字典中重新创建对象?
答案 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}
};
}
}