2011-06-29 8 views
9

Używam ravendb do serializacji obiektu i przetestować go za pomocą mstest.Co muszę zrobić, aby przechowywać obiekty w RavenDB?

otrzymuję ten wynik: System.ArgumentException: Object serialized to String. RavenJObject instance expected.

Oto mój kod

public class Store 
{ 
    private static IDocumentStore store = createStore(); 

    private static EmbeddableDocumentStore createStore() 
    { 
     var returnStore = new EmbeddableDocumentStore(); 
     returnStore.DataDirectory = @"./PersistedData"; 
     returnStore.Initialize(); 
     return returnStore; 
    } 

    public static void Write(string value) 
    { 
     using (var session = store.OpenSession()) 
     { 
      session.Store(value); 
      session.SaveChanges(); 
     } 
    } 
} 

Wydaje przyczyny jest jak RavenJObject działa jak to rzuca ten sam błąd:

RavenJObject storeMe = RavenJObject.FromObject("errors", new JsonSerializer()); 

Jak wykonać niestandardową serializację w RavenDB?

+0

Czemu przechowywania tylko ciąg? W jaki sposób zamierzasz ponownie przesłać zapytanie? Zazwyczaj przechowujesz obiekt za pomocą właściwości Id. –

+0

Właściwie próbuję przechowywać niestandardowy obiekt dziedziczący z listy , ale nie chciałbym przeciągać w gąszczu mojego kodu. I myślę, że jeśli zrozumiem przypadek łańcucha znaków, dowiem się, dlaczego mój obiekt nie zapisuje. –

+0

Nie sądzę, że będzie działać z dziedziczeniem z Listy , ale działa, jeśli otoczysz Listę . Dlaczego musisz go odziedziczyć? –

Odpowiedz

7

Aby zrobić niestandardową serializacji z klasą nie napisałeś (więc nie można przypisywać) wdrożyć Newtonsoft.Json.JsonConverter

następnie zarejestrować go tak:

using (var session = store.OpenSession()) 
    { 
     session.Advanced.Conventions.CustomizeJsonSerializer = serializer => serializer.Converters.Add(MailAddressJsonConverter.Instance); 
     session.Store(mailAddress); 
     session.SaveChanges(); 
    } 
+2

Po prostu notka - musiałem użyć session.Advanced.DocumentStore.Conventions.CustomizeJsonSerializer, a nie session.Advanced.Conventions.CustomizeJsonSerializer. –

0

Spróbuj użyć RavenJArray.FromObject(..) że będzie pracować z listą

+0

Stworzyłem szybki test na to i nadal nie udało się, próbując przechowywać wystąpienie mojej klasy testowej MyClass: List nie działa niezależnie od tego, przekazuję ją bezpośrednio lub zawijam w twoim przykładzie. Chętnie wypróbuje inne techniki i nauczy się czegoś nowego o Raven. –

+0

Przepraszam, że tęsknię - przeczytaj pytanie. Myślałem, że David próbował przechowywać listę obiektów, a nie obiekt, który implementuje listę.

5

Według naszej dyskusji w komentarzach pytanie Raven spodziewa się obiekty, które są przechowywane być regularne zajęcia, co mam na myśli, to powinny one JSON serializacji Do struktura {Id: ...}.

Zapisywanie ciągu znaków (JSON "...") lub listy (JSON [{}, {}]) bezpośrednio nie działa. Chociaż oczywiście możesz przechowywać je jako właściwości twojego obiektu dokumentu.

Powiązane problemy