2

Clouchbase.liteでDocumentとしてデータを保存する場合は、DictionaryCouchbase.liteで保存/ロードするDictionary <string、Object>へのオブジェクトのシリアル化/逆シリアル化の方法

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のドキュメントを理解していれば、このプロセスは再帰的ではなく、自分のオブジェクトのフィールドとプロパティの最初のレベルにあります。

このような辞書からオブジェクトを再作成するにはどうすればよいですか?

答えて

1

これは私の質問に対する完全な答えではありませんが、今のところ問題を解決しています。私はCouchbase.Liteに渡される辞書にオブジェクト全体を置くの溶液に来た:エンドOに

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

はCと同じ値が含まれています。

は、私は常に「正しい方法は、」働き方であることを主張します:

私はジム・ボーデンは、このアプローチを私に与えた警告を指摘したいと思います。ライブラリがJSON .NETを内部的に使用しているという事実は、 という具合ですが、実装は です。それが何らかの理由で変更された場合は、この方法で が壊れてしまいます。私はまた、クラスがもっと複​​雑な場合は、あなたの例よりも複雑であると感じています。私たちは現在、 (データベースにクラスを直接保存し、 辞書に最初に変換せずに保存する)を実行するクロスプラットフォーム仕様を設計しています。 (これはC#だけではなく、 JavaとObjective-Cも同様)に入る必要があるため、これは遅いプロセスです。たとえば、クラス をシリアル化する方法を教えてください。JSON .NETを知っています。 はすでにこれを行っていますが、JSON .NETを公開することを希望しません。 公開APIそれは切り替え可能でなければなりません( プラットフォーム上の理由によりJSON .NETが機能しない場合)。

+0

公式チケットはここにある:https://github.com/couchbase/couchbase -lite-net/issues/275 Pity、最近氷上に置かれた –

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

} 
関連する問題