使用 documentStore.Conventions.CustomizeJsonSerializer 事件自定义 RavenDB 中的序列化过程

Customizing the serialization process in RavenDB using documentStore.Conventions.CustomizeJsonSerializer event

我正在尝试使用 "Inside RavenDB 3.0" 书中的 RavenDB 中的自定义序列化器进行序列化。

    void Main()
    {
    var documentStore = DocumentStoreHolder.Store;
    documentStore.Conventions.CustomizeJsonSerializer += serializer =>
      {
          serializer.Converters.Add(new JsonMoneyConverter());
      };
      Store(documentStore);
}

// Define other methods and classes here

public static void Store(IDocumentStore documentStore)
{

    using (var session = documentStore.OpenSession())
    {

        //session.Advanced.DocumentStore.Conventions.CustomizeJsonSerializer=serializer=>serializer.Converters.Add(new JsonMoneyConverter());
        var money = new Money
        {
            Amount = 10,
            Currency = "USD"


        };
        session.Store(money);

        session.SaveChanges();
    }

}
public class Money
{
    public string Currency { get; set; }
    public decimal Amount { get; set; }
}

public class JsonMoneyConverter : JsonConverter
{
   public override void WriteJson(JsonWriter writer,object value,JsonSerializer serializer)
   {
      var money = (Money)value;
      writer.WriteValue(money.Amount+" "+money.Currency);

   }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var parts = reader.ReadAsString().Split();
        return new Money
        {
            Amount = decimal.Parse(parts[0]),
            Currency = parts[1]
        };

   }
   public override bool CanConvert(Type objectType)
   {
      return objectType==typeof(Money);

   }

}

但是在执行代码后,session.SaveChanges() 抛出一个 RavenJObject 预期的异常。 以下是堆栈跟踪:

     at Raven.Json.Linq.RavenJObject.FromObject(Object o, JsonSerializer jsonSerializer)
   at Raven.Client.Document.EntityToJson.GetObjectAsJson(Object entity)
   at Raven.Client.Document.EntityToJson.ConvertEntityToJson(String key, Object entity, RavenJObject metadata)
   at Raven.Client.Document.InMemoryDocumentSessionOperations.EntityChanged(Object entity, DocumentMetadata documentMetadata, IDictionary`2 changes)
   at Raven.Client.Document.InMemoryDocumentSessionOperations.<PrepareForEntitiesPuts>b__110_0(KeyValuePair`2 pair)
   at System.Linq.Enumerable.WhereEnumerableIterator`1.MoveNext()
   at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
   at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
   at Raven.Client.Document.InMemoryDocumentSessionOperations.PrepareForEntitiesPuts(SaveChangesData result)
   at Raven.Client.Document.InMemoryDocumentSessionOperations.PrepareForSaveChanges()
   at Raven.Client.Document.DocumentSession.SaveChanges()
   at UserQuery.Store(IDocumentStore documentStore) in C:\Users\shubha\AppData\Local\Temp\LINQPad5\_ybzzxotj\query_wwckxu.cs:line 63
   at UserQuery.Main() in C:\Users\shubha\AppData\Local\Temp\LINQPad5\_ybzzxotj\query_wwckxu.cs:line 42
   at LINQPad.ExecutionModel.ClrQueryRunner.Run()
   at LINQPad.ExecutionModel.Server.RunQuery(QueryRunner runner)
   at LINQPad.ExecutionModel.Server.StartQuery(QueryRunner runner)
   at LINQPad.ExecutionModel.Server.<>c__DisplayClass152_0.<ExecuteClrQuery>b__0()
   at LINQPad.ExecutionModel.Server.SingleThreadExecuter.Work()
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()

请让我知道我的代码哪里出错了。我是 RavenDB 的新手,可能缺少另一种调用 session.SaveChanges() 或在某处添加标志的方法。 TIA

问题是您试图将根对象转换为字符串,这是不允许的。 RavenDB 中的文档必须是 JSON 对象,但您的转换器会将其转换为字符串。如果您有一个包含它的父对象,您的代码将起作用。