2

Wenn ich Daten als Dokument in Clouchbase.lite speichern möchte, muss in Form von Dictionary sein dies wie:C# Wie serialisieren/deserialisieren eines Objekts zu/von Dictionary <string, Objekt> zu speichern/laden in Couchbase.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); 

Wie kann ich automatisch ein solches Wörterbuch von jedem C# Objekt? Wenn ich die couchbase.lite Dokumentation verstehe, ist dieser Prozess nicht rekursiv, nur auf der ersten Ebene meiner Objektfelder und Eigenschaften.

Wie kann ich meine Objekte aus einem solchen Wörterbuch wiederherstellen?

Antwort

1

Ok, das ist keine vollständige Antwort auf meine Frage, aber es löst das Problem für den Moment. Ich kam zu der Lösung, die das gesamte Objekt in das Wörterbuch des Setzens, die Couchbase.Lite übergeben wird:

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

Am Ende o die gleichen Werte wie c enthält.

Ich mag die Warnung darauf hinweisen, dass Jim Borde mich zu diesem Ansatz gab:

Ich werde immer behaupten, dass der „richtige Weg“ ist die Art und Weise, die funktioniert. Die Tatsache, dass die Bibliothek JSON .NET intern verwendet, ist jedoch eine Implementierung Detail. Wenn sich das aus irgendeinem Grund ändern würde, würde dieser Weg brechen. Ich habe auch das Gefühl, dass wenn die Klasse komplexer wäre als Ihr Beispiel, würde es auch brechen. Wir sind derzeit Entwerfen einer Cross-Plattform-Spezifikation, um genau das zu tun, was Sie möchten tun (speichern Sie Klassen direkt in der Datenbank ohne Konvertierung in ein Wörterbuch zuerst). Dies wird ein langsamer Prozess sein, weil es viele Gedanken gibt, die in es gehen müssen (nicht nur für C#, sondern auch für Java und Objective-C). Zum Beispiel, wie man eine Klasse mit einer Eigenschaft serialisiert, die darauf verweist, usw. Ich weiß, JSON .NET tut dies bereits, aber ich möchte nicht beginnen, JSON .NET in der öffentlichen API offen zu legen, weil schließlich Es sollte umschaltbar sein (im Fall funktioniert JSON .NET aus irgendeinem Grund auf einer Plattform nicht).

+0

Die offizielle Ticket ist hier: https://github.com/couchbase/couchbase -lite-net/issues/275 Schade, dass es in letzter Zeit wieder auf Eis gelegt wurde –

0

Ich weiß, Sie über die automatische sprechen, aber ich brauchte die einzelnen Felder meiner Klasse ausgesetzt werden, so kann ich indizieren und kartiert Abfragen ausführen. Also habe ich angegeben alle meine abfrage der Lage, Objekte diese Schnittstelle folgen:

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

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

} 

und in der Regel wie folgt umgesetzt:

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

} 
Verwandte Themen