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); }
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); }
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); }
/// <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); }