私のプロジェクトでは、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);
}
}