Что мне нужно сделать, чтобы хранить объекты в RavenDB? - PullRequest
9 голосов
/ 29 июня 2011

Я использую ravendb для сериализации объекта и проверки его через mstest.

Я получаю такой результат: 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?

Ответы [ 3 ]

7 голосов
/ 30 июня 2011

Чтобы выполнить пользовательскую сериализацию с классом, который вы не написали (поэтому вы не можете приписать), реализуйте Newtonsoft.Json.JsonConverter

Затем зарегистрируйте его так:

using (var session = store.OpenSession())
     {
         session.Advanced.Conventions.CustomizeJsonSerializer = serializer => serializer.Converters.Add(MailAddressJsonConverter.Instance);
         session.Store(mailAddress);
         session.SaveChanges();
     }
5 голосов
/ 29 июня 2011

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

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

0 голосов
/ 29 июня 2011

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

...