對於我的項目,我必須反序列化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);
}
}
是的,我做到了。但是因爲我使用授權捆綁包,所以我必須保持960。 –