2011-06-29 11 views
9

Estoy usando ravendb para serializar un objeto y probarlo a través de mstest.¿Qué debo hacer para almacenar objetos en RavenDB?

Estoy consiguiendo este resultado: System.ArgumentException: Object serialized to String. RavenJObject instance expected.

Aquí está mi código

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

Parece que la causa fundamental está en cómo funciona RavenJObject ya que esto arroja el mismo error:

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

¿Cómo hago una serialización personalizada en RavenDB?

+0

¿Por qué estás almacenando solo una cuerda? ¿Cómo piensa consultarlo de nuevo? Normalmente, almacena un objeto con una propiedad Id. –

+0

Estoy tratando de almacenar un objeto personalizado que hereda de la lista pero no quería arrastrar un montón de mi código. Y creo que si entiendo la caja de cuerdas sabré por qué mi objeto no se guarda. –

+0

No creo que funcione inherting desde la lista , pero sí funciona si ajusta la lista . ¿Por qué necesitas heredar de él? –

Respuesta

7

Para hacer la serialización personalizado con una clase que no escribiste (por lo que no se puede atribuir) aplicar Newtonsoft.Json.JsonConverter

continuación, se registra así:

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

Solo una nota: tuve que usar session.Advanced.DocumentStore.Conventions.CustomizeJsonSerializer, no session.Advanced.Conventions.CustomizeJsonSerializer. –

0

Intente utilizar RavenJArray.FromObject(..) que trabajará con una lista

+0

Hice una prueba rápida para esto y aún falló, tratando de almacenar una instancia de mi clase de prueba MyClass: List falla independientemente de que lo pase directamente o lo envuelva en su ejemplo. Feliz de probar algunas otras técnicas y aprender algo nuevo sobre Raven. –

+0

Perdón, echo de menos la pregunta. Pensé que David intentaba almacenar una lista de objetos, no un objeto que implementara la Lista

5

De acuerdo con nuestra discusión en los comentarios de interrogación, Raven espera que los objetos que se están almacenando a ser las clases regulares, lo que quiero decir con esto es que deben JSON serializar a una estructura de {Id: ...}.

Almacenar una cadena (JSON "...") o una lista (JSON [{}, {}]) directamente, no va a funcionar. Aunque, por supuesto, puede almacenar estos como propiedades de su objeto de documento.

Cuestiones relacionadas