Для моего проекта я должен десериализовать строку Uri и следую предложению, предложенному в этом SO question путем создания собственного конвертера.
Когда я добавляю преобразование в сериализатор, представленный в RavenDB, я получаю следующую ошибку:
TestSuite.EmailSMSTests.CanSendSMSWithFilter: System.ArrayTypeMismatchException : Попытка доступа к элементу как типу, несовместимому с массивом.
Я добавляю преобразователь таким образом:
docStore.Conventions.CustomizeJsonSerializer = serializer => serializer.Converters.Add(new UriJsonConverter());
docStore.Initialize();
Я могу успешно добавить преобразователь, если создам JsonSerializer с Json.Net:
var serializer = new JsonSerializer();
serializer.Converters.Add(new UriJsonConverter());
Я подозреваю, что это может быть связано с перенаправлением сборки, так как мне нужна более поздняя версия Json.Net, которая работает с RESTSharp. В проекте используется 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);
}
}