Json序列化时Long类型处理

Json序列化时Long类型处理

在C#里【java等也是一样】
int类型的最大值:2147483647
uint类型的最大值:4294967295
long类型的最大值:9223372036854775807
ulong类型的最大值:18446744073709551615

在Js里
数字类型的最大值(安全值):9007199254740991
当数字超过这个值的时候,数字会变的不准确【其实就是另外一个数字】,于是进行查询等操作时,查不到相应的对象。

若怕出现这个情况,请使用int而不是long。

在这个情况下,就需要对long、ulong类型进行额外的处理【转成字符串】
以下是一个代码示例:

public class StrLongConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        long v = value is ulong ? (long)(ulong)value : (long)value;
        writer.WriteValue(v.ToString());
    }
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        string str = reader.Value.ToString();
        long v = str.ToLong(0);//这是一个自己封装的方法,请不用在意
        return typeof(ulong) == objectType ? (object)(ulong)v : v;
    }
   public override bool CanConvert(Type objectType)
   {
        switch (objectType.FullName)
        {
            case "System.Int64":
            case "System.UInt64":
                return true;
            default:
                return false;
        }
    }
}

实例
twitter有一个雪花算法,生成long类型的ID,由于生成的ID值很大,需要进行这样的处理

雪花算法原理:
时间戳+机器码+序列号
时间戳:当前时间的毫秒数
机器码:当前服务器分配的一个数字编码
序列号:允许1毫秒内的最大序列号

注意点:
服务器时间变更有可能出现生成重复ID,使用该算法需要控制好服务器的时间