示例#1
0
        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())
                }
            }));
        }
示例#2
0
        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);
        }
示例#3
0
        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);
        }
示例#4
0
        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);
        }