[英]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.