1

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

    }
4

2 に答える 2

0

json 4.5.7 を使用する Raven クライアント 972 を試しましたか? https://nuget.org/packages/RavenDB.Client/1.0.972

于 2012-10-11T00:56:26.170 に答える
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());

...
}
于 2016-04-22T22:21:47.830 に答える