Exemplo n.º 1
0
        int WriteStructList(object value, DataBuffer db, DataTypeInfo info)
        {
            var list = value as IList;

            if (list != null)
            {
                if (list.Count > 0)
                {
                    int    el  = info.ElementLength;
                    int    dl  = info.DataLength;
                    IntPtr ptr = UnsafeOperation.GetObjectAddr(list);
                    ptr = UnsafeOperation.GetListElement(ptr, 0);

                    FakeStructArray fsa = new FakeStructArray(db, el, list.Count);
                    unsafe
                    {
                        FakeStruct fs = new FakeStruct(db, el, fsa.ip);
                        for (int i = 0; i < list.Count; i++)
                        {
                            fs.SetPoint(fsa[i]);
                            WriteStruct(info, ptr, fs);
                            ptr += dl;
                        }
                    }
                    return(db.AddData(fsa, DataType.FakeStructArray));
                }
            }
            return(0);
        }
Exemplo n.º 2
0
        object ReadObject(DataTypeInfo dt, FakeStruct fake, int dataIndex)
        {
            for (int i = 0; i < objList.Count; i++)
            {
                if (objList[i].index == dataIndex)
                {
                    return(objList[i].instance);
                }
            }
            var          obj = dt.Construction();
            ClassContext cc  = new ClassContext();

            cc.instance = obj;
            cc.index    = dataIndex;
            objList.Add(cc);
            IntPtr ptr = UnsafeOperation.GetObjectAddr(obj);
            var    mf  = dt.matchedFields;

            if (mf != null)
            {
                for (int i = 0; i < mf.Length; i++)
                {
                    ReadField(fake, 0, mf[i], ptr);
                }
            }
            return(obj);
        }
Exemplo n.º 3
0
        object ReadStructToObject(DataTypeInfo dt, FakeStruct fake, int start)
        {
            var    obj = dt.Construction();
            IntPtr ptr = UnsafeOperation.GetObjectAddr(obj);
            var    mf  = dt.matchedFields;

            if (mf != null)
            {
                for (int i = 0; i < mf.Length; i++)
                {
                    ReadField(fake, start, mf[i], ptr);
                }
            }
            return(obj);
        }
Exemplo n.º 4
0
        /// <summary>
        /// 写入类的数据
        /// </summary>
        /// <param name="typeIndex"></param>
        /// <param name="instance"></param>
        /// <param name="db"></param>
        /// <returns></returns>
        int WriteObject(DataTypeInfo dt, object instance, DataBuffer db)
        {
            if (instance == null)
            {
                return(0);
            }
            for (int i = 0; i < objList.Count; i++)
            {
                if (objList[i].instance == instance)
                {
                    return(objList[i].index);
                }
            }
            int typeIndex = dt.typeIndex;

            if (HaveDerived)
            {
                string fullName = instance.ToString();
                if (fullName != dt.fullName)
                {
                    dt = dataInfo.FindTypeInfo2(fullName);
                }
                if (dt == null)
                {
                    return(0);
                }
                else
                {
                    DerivedData = true;
                    typeIndex   = dt.typeIndex;
                }
            }
            FakeStruct   fake = new FakeStruct(db, types[typeIndex].ElementLength);
            int          r    = db.AddData(fake, DataType.FakeStruct);
            ClassContext cc   = new ClassContext();

            cc.instance = instance;
            cc.index    = typeIndex << 16 | r;
            objList.Add(cc);
            var    dts = dt.dataFeilds;
            IntPtr ptr = UnsafeOperation.GetObjectAddr(instance);

            for (int i = 0; i < dts.Count; i++)
            {
                WriteField(fake, 0, dts[i], ptr);
            }
            return(cc.index);
        }