private SerializedValue serializeDictionary(object getValue) { var type = getValue.GetType(); var dict = ((IDictionary)getValue); var keyType = type.GetGenericArguments()[0]; var valueType = type.GetGenericArguments()[1]; return(SerializedValue.CreateComplex(getSerializedType(type), new[] { new SerializedAttribute() { Name = "Keys", Type = getSerializedType(keyType), Value = toSerializedValue(dict.Keys.Cast <object>().ToArray()) }, new SerializedAttribute() { Name = "Values", Type = getSerializedType(valueType), Value = toSerializedValue(dict.Values.Cast <object>().ToArray()) } })); }
private object deserializeDictionary(Type type, SerializedValue value) { var dict = (IDictionary)Activator.CreateInstance(type); var keys = (IList)deserializeValue(value.ComplexAttributes.First(v => v.Name == "Keys").Value); var values = (IList)deserializeValue(value.ComplexAttributes.First(v => v.Name == "Values").Value); for (int i = 0; i < keys.Count; i++) { var key = keys[i]; var val = values[i]; dict[key] = val; } return(dict); }
private object deserializeValue(SerializedValue value) { if (value.IsNullReference()) { return(null); } var type = deserializeType(value.Type); if (type == null) { throw new InvalidOperationException("Cant deserialize type"); } if (value.IsSimple()) { return(stringSerializer.Deserialize(value.SimpleValue, type)); } if (value.IsArray() && type.IsArray) { var arr = (IList)Array.CreateInstance(type.GetElementType(), value.ArrayElements.Length); for (int i = 0; i < value.ArrayElements.Length; i++) { arr[i] = deserializeValue(value.ArrayElements[i]); } return(arr); } if (value.IsArray() && isList(type)) { var list = (IList)Activator.CreateInstance(type); for (int i = 0; i < value.ArrayElements.Length; i++) { list.Add(deserializeValue(value.ArrayElements[i])); } return(list); } if (isDictionary(type)) { return(deserializeDictionary(type, value)); } if (value.IsComplex()) { return(deserializeStruct(type, value.ComplexAttributes)); // struct } if (value.IsReference()) { return(getOrCreatePO(value.ReferenceIdentifier, type)); } throw new InvalidOperationException("Cant deserialize this type"); //throw new Exception("Cant serialize value of type: " + getValue.GetType() + " value: " + getValue); }
private SerializedValue toSerializedValue(object getValue) { if (getValue == null) { return(SerializedValue.NullReference); } var type = getValue.GetType(); SerializedType sType = getSerializedType(type); if (stringSerializer.CanSerialize(getValue, type)) { return(SerializedValue.CreateSimple(sType, stringSerializer.Serialize(getValue))); } if (type.IsArray) { return(SerializedValue.CreateArray(sType, ((IEnumerable)getValue).Cast <object>().Select(toSerializedValue).ToArray())); } if (isList(type)) { return(SerializedValue.CreateArray(sType, ((IEnumerable)getValue).Cast <object>().Select(toSerializedValue).ToArray())); } if (isDictionary(type)) { return(serializeDictionary(getValue)); } if (type.IsValueType) // struct { return(SerializedValue.CreateComplex(sType , getAllFields(type).Select(f => createAttributeFromField(getValue, f)).ToArray())); } if (isPO(getValue)) { onVisitPO(getValue); return(SerializedValue.CreateReference(sType, getPOIdentifier(getValue))); } throw new Exception("Cant serialize value of type: " + getValue.GetType() + " value: " + getValue); }