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 回答