【问题标题】:What do I need to do to store objects in RavenDB?在 RavenDB 中存储对象需要做什么?
【发布时间】:2011-06-29 00:17:33
【问题描述】:

我正在使用 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 中进行自定义序列化?

【问题讨论】:

  • 为什么只存储一个字符串?你打算如何再次查询它?通常,您存储一个带有 Id 属性的对象。
  • 我实际上是在尝试存储一个继承自 List 的自定义对象,但我不想拖入一堆代码。而且我想如果我理解字符串大小写,我就会知道为什么我的对象不保存。
  • 我不认为它会从 List 继承,但如果你包装 List 它确实有效。为什么需要继承它?
  • 我可以改变我的程序的工作方式。在这一点上,我试图了解序列化程序是如何工作的,然后我将更改我的代码以适应它。
  • 嗯,我认为您的问题是文档需要是类。它们可以包含任何类型的属性,包括列表,但文档本身需要是常规类。因此,根本不支持您存储字符串或直接存储列表的两个测试用例。至少我所知道的不是。考虑通过序列化字符串“...”或列表 [{},{}] 生成的 JSON,您希望它是一个对象 {}。

标签: ravendb


【解决方案1】:

要使用您未编写的类(因此您不能属性)进行自定义序列化,请实现 Newtonsoft.Json.JsonConverter

然后像这样注册:

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

【讨论】:

  • 请注意 - 我必须使用 session.Advanced.DocumentStore.Conventions.CustomizeJsonSerializer,而不是 session.Advanced.Conventions.CustomizeJsonSerializer。
【解决方案2】:

根据我们在问题 cmets 中的讨论,Raven 期望您存储的对象是常规类,我的意思是它们应该 JSON 序列化为 {Id:...} 的结构。

直接存储字符串 (JSON "...") 或列表 (JSON [{},{}]) 是行不通的。当然,您可以将这些存储为文档对象的属性。

【讨论】:

    【解决方案3】:

    尝试使用RavenJArray.FromObject(..) 来处理列表

    【讨论】:

    • 我对此进行了快速测试,但它仍然失败,试图存储我的测试类 MyClass 的实例: List 失败,不管它我直接传递它或将它包装在你的例子。很高兴尝试一些其他技术并了解有关 Raven 的新知识。
    • 对不起,我错过了这个问题。我以为大卫试图存储对象列表,而不是实现 List 的对象
    猜你喜欢
    • 2013-01-10
    • 2017-03-16
    • 1970-01-01
    • 2012-04-21
    • 1970-01-01
    • 2019-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多