2012-10-10 52 views
1

對於我的項目,我必須反序列化Uri字符串,並且通過創建自定義轉換程序來遵循此SO question中提供的建議。無法使用RavenDB和JsonConverter自定義序列化程序 - 可能與Json.Net 4.0.8不兼容性

當我的轉換添加到RavenDB暴露我得到以下錯誤串行:

TestSuite.EmailSMSTests.CanSendSMSWithFilter: System.ArrayTypeMismatchException:試圖訪問一個元素作爲一種類型的與陣列不相容。

我以這種方式加入轉爐:

docStore.Conventions.CustomizeJsonSerializer = serializer => serializer.Converters.Add(new UriJsonConverter()); 
docStore.Initialize(); 

我可以成功地加入轉爐,如果我創建一個Json.Net JsonSerializer:

var serializer = new JsonSerializer(); 
serializer.Converters.Add(new UriJsonConverter()); 

我懷疑這可能是由於程序集重定向,因爲我需要一個適用於RESTSharp的更高版本的Json.Net。該項目使用Raven.client 960,Json.Net 4.08和Json.Net 4.5.7。歡迎任何見解。

這是轉換器的代碼:

public class UriJsonConverter : JsonConverter 
    { 

     public override bool CanConvert(Type objectType) 
     { 
      return object.Equals(objectType, typeof(Uri)); 
     } 

     public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
     { 
      switch (reader.TokenType) 
      { 
       case JsonToken.String: 
        return CreateUri((string)reader.Value); 
       case JsonToken.Null: 
        return null; 
       default: 
        var msg = string.Format("Unable to deserialize Uri from token type {0}", reader.TokenType); 
        throw new InvalidOperationException(msg); 
      } 
     } 

     private static Uri CreateUri(string uriString) 
     { 
      Uri uri; 
      if (!Uri.TryCreate(uriString, UriKind.Absolute, out uri)) 
       if (!Uri.TryCreate(uriString, UriKind.Absolute, out uri)) 
        if (!Uri.TryCreate(uriString, UriKind.RelativeOrAbsolute, out uri)) 
        { 
         var msg = string.Format("Unable to determine proper UriKind for Uri {0}", uriString); 
         throw new InvalidOperationException(msg); 
        } 
      return uri; 
     } 

     public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
     { 
      if (null == value) 
      { 
       writer.WriteNull(); 
       return; 
      } 

      var uri = value as Uri; 
      if (uri != null) 
      { 
       writer.WriteValue(uri.OriginalString); 
       return; 
      } 
      var msg = string.Format("Unable to serialize {0} with {1}", value.GetType(), typeof(UriJsonConverter)); 
      throw new InvalidOperationException(msg); 
     } 

    } 

回答

0

因爲一些奇怪的原因,Raven DB在其客戶端包含一個老版本的Newtonsoft JSON。要註冊一個類型轉換器,你必須這樣做:

using (var store = new DocumentStore { Url = "http://..." }) 
{ 
    store.Initialize(); 

    // Required if you are going to serialize Identity types 
    store.Conventions.IdentityTypeConvertors.Add(new IdentityTypeConverter()); 

    // This is how you register 
    store.Conventions.CustomizeJsonSerializer = serializer => serializer.Converters.Add(new IdentityTypeConverter()); 

... 
} 
相關問題