对于我的项目,我必须反序列化一个 Uri 字符串,并通过创建一个自定义转换器来 遵循这个SO 问题中提供的建议。
当我将转换添加到 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);
}
}