private IVPackKeyMapAdapter GetKeyMapAdapter(Type type) { IVPackKeyMapAdapter adapter = this.keyMapAdapters[type]; if (adapter == null && type.GetTypeInfo().IsEnum) { adapter = VPackKeyMapAdapters.CreateEnumAdapter(type); } return(adapter); }
/// <exception cref="System.MissingMethodException"/> /// <exception cref="java.lang.IllegalAccessException"/> /// <exception cref="java.lang.reflect.InvocationTargetException"/> /// <exception cref="VPackException"/> private void SerializeMap( string name, object value, VPackBuilder builder, Type keyType, IDictionary <string, object> additionalFields) { IDictionary map = (IDictionary)value; if (map.Count > 0) { IVPackKeyMapAdapter keyMapAdapter = this.GetKeyMapAdapter(keyType); if (keyMapAdapter != null) { builder.Add(name, ValueType.OBJECT); foreach (KeyValuePair <object, object> entry in map) { object entryValue = entry.Value; this.AddValue( keyMapAdapter.Serialize(entry.Key), entryValue != null ? entryValue.GetType() : typeof(object), entry.Value, builder, null, additionalFields); } builder.Close(); } else { builder.Add(name, ValueType.ARRAY); foreach (KeyValuePair <object, object> entry in map) { string s = null; builder.Add(s, ValueType.OBJECT); this.AddValue(ATTR_KEY, entry.Key.GetType(), entry.Key, builder, null, additionalFields); this.AddValue(ATTR_VALUE, entry.Value.GetType(), entry.Value, builder, null, additionalFields); builder.Close(); } builder.Close(); } } else { builder.Add(name, ValueType.OBJECT); builder.Close(); } }
/// <exception cref="java.lang.InstantiationException"/> /// <exception cref="java.lang.IllegalAccessException"/> /// <exception cref="System.MissingMethodException"/> /// <exception cref="java.lang.reflect.InvocationTargetException"/> /// <exception cref="VPackException"/> private IDictionary DeserializeMap(VPackSlice parent, VPackSlice vpack, Type type, Type keyType, Type valueType) { var info = type.GetTypeInfo(); int length = vpack.GetLength(); IDictionary value; if (typeof(IDictionary).GetTypeInfo().IsAssignableFrom(info) && info.IsClass) { value = (IDictionary)CreateInstance(type); } else { value = new Dictionary <object, object>(length); } if (length > 0) { IVPackKeyMapAdapter keyMapAdapter = this.GetKeyMapAdapter(keyType); if (keyMapAdapter != null) { for (IEnumerator <IEntry <string, VPackSlice> > iterator = vpack.ObjectIterator(); iterator.MoveNext();) { IEntry <string, VPackSlice> next = iterator.Current; object name = keyMapAdapter.Deserialize(next.Key); value[name] = GetValue(vpack, next.Value, valueType, name.ToString()); } } else { for (int i = 0; i < vpack.GetLength(); i++) { VPackSlice entry = vpack.Get(i); object mapKey = GetValue(parent, entry.Get(ATTR_KEY), keyType, null); object mapValue = GetValue(parent, entry.Get(ATTR_VALUE), valueType, null); value[mapKey] = mapValue; } } } return(value); }