You signed in with another tab or window.
Reload
to refresh your session.
You signed out in another tab or window.
Reload
to refresh your session.
You switched accounts on another tab or window.
Reload
to refresh your session.
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.