Ejemplo n.º 1
0
 public void SetObjectData(ISerializationData dataHolder, ISerializationContext context)
 {
     using (var it = dataHolder.GetEnumerator())
     {
         while (it.MoveNext())
         {
             Name n     = Name.BuildName(it.FieldName);
             var  value = it.BuildValue <T>();
             Add(n, value);
         }
     }
 }
        public static void ExtractFromFieldData(ISerializationData holder, ref object obj, bool includeBases)
        {
            var objType = obj.GetType();

            if (obj is ISerializable)
            {
                var info = new SerializationInfo(objType, DEFAULT_FORMATER);
                using (var it = holder.GetEnumerator())
                {
                    while (it.MoveNext())
                    {
                        info.AddValue(it.FieldName, it.BuildValue());
                    }
                }

                var c = objType.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public, null,
                                               new[] { typeof(SerializationInfo), typeof(StreamingContext) }, null);
                c.Invoke(obj, new object[] { info, new StreamingContext() });
            }
            else
            {
                var fields = GetSerializableFields(objType, true);
                foreach (var f in fields)
                {
                    if (f.IsNotSerialized)
                    {
                        continue;
                    }

                    var    fieldName = FormatFieldName(f.Name);
                    object fieldValue;
                    var    nodeValue = holder.GetValueGraphNode(fieldName);
                    if (nodeValue == null)
                    {
                        fieldValue = GetDefaultValueForType(f.FieldType);
                    }
                    else
                    {
                        fieldValue = nodeValue.RebuildObject(f.FieldType);
                    }

                    f.SetValue(obj, fieldValue);
                }
            }
        }