public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { IVirtualListSerializable vlist = (IVirtualListSerializable)value; Dictionary <string, int> dictToSerialize = vlist.InitialPositionOfEachPage; if (dictToSerialize.Count > 1) { dictToSerialize = dictToSerialize.GroupBy(k => k.Value) .Select(group => group.Last()) .ToDictionary(pair => pair.Key, pair => pair.Value); } writer.WriteStartArray(); writer.WriteValue(vlist.ListType); writer.WriteValue(vlist.Count); if (vlist.Count > 0) { serializer.Serialize(writer, dictToSerialize); } writer.WriteEndArray(); }
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { IVirtualListSerializable vlist = (IVirtualListSerializable)value; writer.WriteStartObject(); writer.WritePropertyName("@arr"); writer.WriteValue("1"); writer.WritePropertyName("ltype"); writer.WriteValue(vlist.ListType); writer.WritePropertyName("UniqueID"); writer.WriteValue(vlist.UniqueID); writer.WritePropertyName("Count"); writer.WriteValue(vlist.Count); writer.WritePropertyName("uids"); writer.WriteStartArray(); var type = vlist.GetType().GetGenericArguments()[0]; foreach (KeyValuePair <string, int> val in vlist.InitialPositionOfEachPage) { Page p = vlist.PageManager.LoadPage(val.Key); foreach (var item in p.GetStoredObjects()) { LazyObject lazy = (LazyObject)item; if (lazy.TargetUniqueID != null) { writer.WriteValue(lazy.TargetUniqueID); } else { //We have to validate if the type is not a Struct //because the structs shouldn't go to client at this moment. if (!(!type.IsEnum && !type.IsPrimitive && type.IsValueType && type != typeof(DateTime))) { writer.WriteValue(lazy.Target); } } } } writer.WriteEndArray(); writer.WriteEndObject(); }
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { IVirtualListSerializable vlist = (IVirtualListSerializable)existingValue; reader.Read(); var typelist = (long)reader.Value; reader.Read(); int count = (int)(long)reader.Value; vlist.ListType = (VirtualListTypeEnum)typelist; vlist.InitializeOperationHelper(); vlist.PageUniqueIdOfTheIndexes = new List <string>(); if (count > 0) { reader.Read(); var dictToDeserialize = serializer.Deserialize <Dictionary <string, int> >(reader); dictToDeserialize = vlist.InitialPositionOfEachPage = dictToDeserialize; for (int i = 0; i < dictToDeserialize.Values.Count; i++) { var current = dictToDeserialize.Values.ElementAt(i); int next; if (i + 1 < dictToDeserialize.Values.Count) { next = dictToDeserialize.Values.ElementAt(i + 1); } else { next = count; } for (var j = vlist.PageUniqueIdOfTheIndexes.Count; j < next; j++) { vlist.PageUniqueIdOfTheIndexes.Add(dictToDeserialize.Keys.ElementAt(i)); } } } return(vlist); }