2011-06-29 3 views
9

J'utilise RavenDB pour sérialiser un objet et de le tester par MSTest.Que dois-je faire pour stocker des objets dans RavenDB?

Je reçois ce résultat: System.ArgumentException: Object serialized to String. RavenJObject instance expected.

Voici mon code

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

Il semble que la cause fondamentale est dans la façon dont fonctionne RavenJObject comme cela jette la même erreur:

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

Comment est-ce que je fais la sérialisation personnalisée dans RavenDB?

+0

Pourquoi stockez-vous juste une chaîne? Comment comptez-vous l'interroger à nouveau? Généralement, vous stockez un objet avec la propriété et Id. –

+0

J'essaie en fait de stocker un objet personnalisé qui hérite de la liste mais je ne voulais pas traîner dans un tas de mon code. Et je pense que si je comprends le cas de la chaîne, je saurai pourquoi mon objet ne sauve pas. –

+0

Je ne pense pas que cela fonctionnera inherting de la liste , il ne fonctionne que si vous enveloppez liste cependant. Pourquoi avez-vous besoin d'en hériter? –

Répondre

7

Pour faire sérialisation personnalisé avec une classe que vous n'avez pas écrit (si vous ne pouvez pas attribuer) mettre en œuvre Newtonsoft.Json.JsonConverter

Alors inscrivez-vous comme ceci:

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

Juste une note - je devais utiliser session.Advanced.DocumentStore.Conventions.CustomizeJsonSerializer, pas session.Advanced.Conventions.CustomizeJsonSerializer. –

0

Essayez d'utiliser RavenJArray.FromObject(..) qui fonctionnera avec une liste

+0

mis en place un test rapide pour cela et il a échoué encore, en essayant de stocker une instance de ma classe essai MyClass: Liste échoue, peu importe ce que je le passe directement ou l'envelopper dans votre exemple. Heureux d'essayer d'autres techniques et d'apprendre quelque chose de nouveau à propos de Raven. –

+0

Désolé, j'ai mal lu la question. Je pensais que David a essayé de stocker une liste d'objets, pas un objet qui mettent en œuvre Liste

5

Selon notre discussion dans les commentaires de question, Raven attend les objets que vous stockez être des classes régulières, ce que je veux dire par là qu'ils devraient JSON sérialisation à un structure de {Id: ...}.

Enregistrement d'une chaîne JSON ("...") ou une liste (JSON [{}, {}]) directement, ne va pas au travail. Bien sûr, vous pouvez les stocker en tant que propriétés de votre objet document.

Questions connexes