2011-06-29 3 views
9

Я использую ravendb для сериализации объекта и проверки его через mstest.Что мне нужно сделать, чтобы хранить объекты в RavenDB?

Я получаю этот результат: System.ArgumentException: Object serialized to String. RavenJObject instance expected.

Вот мой код

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

кажется первопричина в том, как RavenJObject работает как это бросает ту же ошибку:

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

Как сделать обычную сериализацию в RavenDB?

+0

Почему вы хранения просто строка? Как вы собираетесь запросить его снова? Обычно вы храните объект с свойством Id и. –

+0

На самом деле я пытаюсь сохранить пользовательский объект, который наследуется из списка , но я не хотел перетаскивать кучу моего кода. И я думаю, что если я пойму строковое дело, я узнаю, почему мой объект не сохраняет. –

+0

Я не думаю, что он будет работать в соответствии с List , но он работает, если вы оберните список . Почему вам нужно унаследовать его? –

ответ

7

Для пользовательской сериализации с классом вы не писали (так что вы не можете приписывать) осуществлять Newtonsoft.Json.JsonConverter

Затем зарегистрировать его, как это:

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

Просто примечание - мне пришлось использовать session.Advanced.DocumentStore.Conventions.CustomizeJsonSerializer, а не session.Advanced.Conventions.CustomizeJsonSerializer. –

0

Попробуйте использовать RavenJArray.FromObject(..), который будет работать со списком

+0

Я собрал для этого быстрый тест, и он все еще не удался, пытаясь сохранить экземпляр моего тестового класса MyClass: List терпит неудачу независимо от него. Я передаю его напрямую или завершаю в вашем примере. Приятно попробовать другие техники и узнать что-то новое о Ворон. –

+0

Извините, я пропустил вопрос. Я думал, что Дэвид пытался сохранить список объектов, а не объект, который реализует List

5

Согласно нашей дискуссии в комментариях вопроса, Raven ожидает объекты, которые вы сохраняете быть регулярными занятиями, что я имею в виду, что они должны JSON сериализацию к структура {Id: ...}.

Сохранение строки (JSON "...") или списка (JSON [{}, {}]) напрямую, не будет работать. Хотя, конечно, вы можете сохранить их как свойства вашего объекта документа.

Смежные вопросы