예제 #1
0
        public Object ToObjct <T>(String binaryString)
        {
            XmlReader  reader_tmp;
            MethodInfo method;
            MethodInfo generic;

            XmlNode xmlDoc = xml.CreateElement("root");

            xmlDoc.InnerXml = binaryString;
            XmlReader reader = new XmlNodeReader(xmlDoc);

            reader.MoveToContent();
            reader.Read();



            if (reader.Value == "null")
            {
                return(null);
            }
            if (typeof(T) == typeof(DateTime))
            {
                while (reader.Name == "Value" || reader.NodeType != XmlNodeType.Text)
                {
                    reader.Read();
                }
                return
                    (Convert.ChangeType(
                         DateTime.ParseExact(reader.Value, "yyyy-MM-ddTHH:mm:ss.fffffffzzz", CultureInfo.InvariantCulture), typeof(T)));
            }
            if (typeof(T).IsPrimitive || typeof(T) == typeof(String))
            {
                while (reader.NodeType != XmlNodeType.Text && reader.GetAttribute("IsEmptyStr") != "true")
                {
                    reader.Read();
                }
                T tmpVar = (T)Convert.ChangeType(reader.Value, typeof(T));

                var asStr = tmpVar as string;
                if (asStr != null && (tmpVar as string) == "null")
                {
                    tmpVar = default(T);
                }


                //reader.ReadToFollowing("Value");
                //reader.Read();
                return(tmpVar);
            }
            if (typeof(T).IsArray)
            {
                while (reader.GetAttribute("IsArray") == null)
                {
                    reader.Read();
                }
                int size = Convert.ToInt32(reader.GetAttribute("Len"));
                reader.Read();

                var array = Array.CreateInstance(typeof(T).GetElementType(), size);


                for (int i = 0; i < size; i++)
                {
                    reader_tmp = reader.ReadSubtree();
                    reader_tmp.MoveToContent();

                    method  = typeof(Serial).GetMethod("ToObjct");
                    generic = method.MakeGenericMethod(Type.GetType(reader.GetAttribute("Type")));

                    var tmpint = generic.Invoke(this, new object[] { reader_tmp.ReadOuterXml() });
                    array.SetValue(tmpint, i);
                    reader.Read();
                }
                Convert.ChangeType(array, typeof(T));
                return(array);
            }
            T ReturnObject;

            ReturnObject = (T)Activator.CreateInstance(typeof(T));

            if (reader.Name == "RefToId" || reader.GetAttribute("IsToId") == "true")
            {
                if (reader.Name == "RefToId")
                {
                    var tmp = relList[Convert.ToInt32(reader.Value)];

                    reader.Skip();
                    return(tmp);
                }
                else if (reader.GetAttribute("IsToId") == "true")
                {
                    var tmp = relList[Convert.ToInt32(reader.GetAttribute("ToId"))];
                    reader.Skip();
                    reader.Read();
                    return(tmp);
                }
            }

            if (Id == 0)
            {
                relList.Add(0, ReturnObject);
                Id = -1;
            }
            else
            {
                if (Convert.ToInt32(reader.GetAttribute("Id")) == 0)
                {
                    return(null);
                }
                if (!relList.ContainsKey(Convert.ToInt32(reader.GetAttribute("Id"))))
                {
                    relList.Add(Convert.ToInt32(reader.GetAttribute("Id")), ReturnObject);
                }
            }



            FieldInfo[] fi =
                ReturnObject.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);


            for (int i = 0; i < fi.Length; i++)
            {
                while (reader.NodeType == XmlNodeType.EndElement || reader.Name != GetCleanFieldName(fi[i]))
                {
                    reader.Read();
                }

                if (IsReferenceType(fi[i].FieldType) && fi[i].FieldType != typeof(DateTime))
                {
                    bool RefFlag  = false;
                    bool ToIdFlag = false;
                    int  id;
                    int  toId;
                    while (!(reader.GetAttribute("IsReference") == "true" ||
                             reader.GetAttribute("IsToId") == "true" ||
                             reader.Name == "RefToId" ||
                             reader.Value == "null") ||
                           reader.NodeType == XmlNodeType.EndElement)
                    {
                        reader.Read();
                    }
                    if (reader.Value == "null")
                    {
                        return(null);
                    }
                    RefFlag  = reader.Name == "RefToId";
                    ToIdFlag = reader.GetAttribute("IsToId") == "true";
                    id       = Convert.ToInt32(reader.GetAttribute("Id"));
                    toId     = Convert.ToInt32(reader.GetAttribute("ToId"));


                    method  = typeof(Serial).GetMethod("ToObjct");
                    generic = method.MakeGenericMethod(fi[i].FieldType);



                    if (RefFlag)
                    {
                        var tmp = relList[Convert.ToInt32(reader.Value)];
                        fi[i].SetValue(ReturnObject, tmp);
                        reader.Skip();
                        reader.Read();
                    }
                    else if (ToIdFlag)
                    {
                        var tmp = relList[toId];
                        fi[i].SetValue(ReturnObject, tmp);
                        reader.Skip();
                    }
                    else
                    {
                        reader_tmp = reader.ReadSubtree();
                        reader_tmp.MoveToContent();


                        var tmp = generic.Invoke(this, new object[] { reader_tmp.ReadOuterXml() });
                        fi[i].SetValue(ReturnObject, tmp);
                    }


                    continue;
                }


                if (reader.Name != GetCleanFieldName(fi[i]))
                {
                    reader.ReadToFollowing(GetCleanFieldName(fi[i]));
                }
                reader_tmp = reader.ReadSubtree();
                reader_tmp.MoveToContent();
                method  = typeof(Serial).GetMethod("ToObjct");
                generic = method.MakeGenericMethod(fi[i].FieldType);

                var tmpint = generic.Invoke(this, new object[] { reader_tmp.ReadOuterXml() });
                fi[i].SetValue(ReturnObject, tmpint);
            }

            return(ReturnObject);
        }