添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
大力的冰棍  ·  BufferedReader 和 ...·  16 小时前    · 
深沉的野马  ·  JavaIO流 ...·  16 小时前    · 
捣蛋的牙膏  ·  java ...·  16 小时前    · 
霸气的跑步机  ·  Strings with ...·  11 小时前    · 
谦和的沙滩裤  ·  主题配置 | ...·  6 小时前    · 
瘦瘦的海龟  ·  媒体报道 | ...·  2 月前    · 

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement . We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account
  • int32 be converted to long
    There is a example:
    object[] a = new object[] {1, 3}; string json = GwJsonSerializeUtil.Serialize(a); var aa = GwJsonSerializeUtil.Deserialize<object[]>(json); var type0 = aa[0].GetType();
    GwJsonSerializeUtil is a class just setting some JsonSerializerSettings as follows:
    Settings = new JsonSerializerSettings(); Settings.TypeNameHandling = TypeNameHandling.All; Settings.ReferenceLoopHandling = ReferenceLoopHandling.Serialize; Settings.TypeNameAssemblyFormatHandling = TypeNameAssemblyFormatHandling.Full; //Settings.PreserveReferencesHandling = PreserveReferencesHandling.All; Settings.Converters.Add(new ArcEngineIPersistStreamConverter());
  • the type0 turns out to be int64 type.
    The reason I found is about JsonTextReader.cs. What I changed is as follows:
    After I changed this codes, I works OK.

  • object[] Type with custom convertors may cause wrong deserialize result.
    in the object array deserialization string, the custom convertor object will lost $type property, which causes the wrong deserialize result. I can only get the JObject type , not my custom Type.
    Here is my custom convertor:
  • /// IPersistStream类型的Json转换器
    public class ArcEngineIPersistStreamConverter : JsonConverter
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    if (value == null) return;
    var typeName = value.GetType().FullName;
    //注意IPersistStream所在的程序集路径在不同电脑上可能不一致,尤其是AE版本不同会出现问题。
    //因此,在使用时要保证序列化时的AE版本与反序列化时的AE版本要一致,否则无法反序列化。
    var assemblyLocation = value.GetType().Assembly.Location;
    IPersistStream pStream = value as IPersistStream;
    if (pStream == null) return;
    IXMLStream xmlStream = new XMLStreamClass();
    pStream.Save(xmlStream as IStream, 0);
    //var str = xmlStream.SaveToString();//直接用string反序列化会有问题
    var bytes = xmlStream.SaveToBytes();
    var str = System.Text.Encoding.Unicode.GetString(bytes);
    //string msg = string.Format("{0}&{1}&{2}", assemblyLocation, typeName, str);
    //writer.WriteValue(msg);

            //另外一种更合理的做法
            writer.WriteStartObject();
            writer.WritePropertyName("AssemblyLocation");
            writer.WriteValue(assemblyLocation);
            writer.WritePropertyName("_Type");
            writer.WriteValue(typeName);
            writer.WritePropertyName("Bytes");
            writer.WriteValue(str);
            writer.WriteEndObject();
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
            //string str = reader.Value as string;
            //if (string.IsNullOrEmpty(str))
            //    return null;
            //var strs = str.Split('&');
            //if (strs.Length != 3)
            //    return null;
            //try
            //    IPersistStream pStream = Assembly.LoadFile(strs[0]).CreateInstance(strs[1]) as IPersistStream;
            //    if (pStream == null) return null;
            //    IXMLStream xmlStream = new XMLStreamClass();
            //    //xmlStream.LoadFromString(strs[2]);//直接用string反序列化会有问题
            //    var bytes = System.Text.Encoding.Unicode.GetBytes(strs[2]);
            //    xmlStream.LoadFromBytes(bytes);
            //    pStream.Load(xmlStream as IStream);
            //    return pStream;
            //catch (Exception ex)
            //    LogHelper.Error.Append(ex);
            //    return null;
            //另外一种更合理的做法
            if (reader == null || reader.TokenType == JsonToken.Null)
                return null;
                JObject jObject = JObject.Load(reader);
                string assemblyLocation = jObject["AssemblyLocation"].ToString();
                string typeName = jObject["_Type"].ToString();
                var bytes = System.Text.Encoding.Unicode.GetBytes(jObject["Bytes"].ToString());
                IPersistStream pStream = Assembly.LoadFile(assemblyLocation).CreateInstance(typeName) as IPersistStream;
                if (pStream == null) return null;
                IXMLStream xmlStream = new XMLStreamClass();
                xmlStream.LoadFromBytes(bytes);
                pStream.Load(xmlStream as IStream);
                return pStream;
            catch (Exception ex)
                LogHelper.Error.Append(ex);
                return null;
        public override bool CanConvert(Type objectType)
            bool b = typeof(IPersistStream).IsAssignableFrom(objectType);
            //这里没有办法严格判断类型,因为如果类型是接口类型,无法判断实现该接口的对象是否实现了IPersistStream接口(属性为接口类型时无法严格判断)
            //这里只能依据名字来大致判断
            if (b || objectType.FullName.Contains("ESRI") || objectType.Assembly.FullName.Contains("ESRI"))
                Console.WriteLine(objectType.FullName);
                return true;
            return false;
    

    Sorry for my pool English.