public uint ExportSize(object srcObj, bool bHavMag, Type objType) { if (srcObj == null) { return(0); } Type t = objType; FieldInfo[] fiarr = t.GetFields(); if (fiarr == null) { return(0); } uint nExportSize = 0; if (bHavMag) { nExportSize += 4; } uint nCount = (uint)fiarr.GetLength(0); for (uint i = 0; i < nCount; i++) { object poValue = fiarr[i].GetValue(srcObj); Type itt = fiarr[i].FieldType; if (!itt.IsPublic) { continue; } //一般Reserved只放在第一个成员,为加速优化 if (i == 0) { if (itt == typeof(Reserved)) { continue; } } nExportSize += 4; if (poValue == null) { continue; } if (itt == typeof(string)) { UniStruct.UniSZ pValue = new UniStruct.UniSZ((string)poValue); nExportSize += pValue.Size(); } else if (itt == typeof(uint) || itt == typeof(uint?) || itt.IsEnum || (itt.IsSerializable && !itt.IsArray)) { nExportSize += 4; } else { uint nSize = 0; if (itt.IsArray) { CUniStructArrayCS cacs = new CUniStructArrayCS(); object poValue2 = fiarr[i].GetValue(srcObj); nSize = cacs.ExportSize(poValue2, itt); } else { nSize = ExportSize(poValue, true, itt); } nExportSize += nSize; } } return((uint)nExportSize); }
public uint Export(object srcObj, bool bHavMag, ref byte[] pOut, uint _nIndex, Type objType) { if (srcObj == null || pOut == null || pOut.Length < _nIndex + 4) { return(0); } Type t = objType; string[] sfiarr = UniWebLib.Struct_ST.GetStructMember(t.Name); if (sfiarr == null) { return(0); } uint nIndex = _nIndex; if (bHavMag) { uint2byte((uint)UNISMAG.UNISTRUCT, ref pOut, nIndex); nIndex += 4; } uint nCount = (uint)sfiarr.Length - 1; for (uint i = 0; i < nCount; i++) { FieldInfo fino = t.GetField(sfiarr[i]); if (fino == null) { continue; } object poValue = fino.GetValue(srcObj); Type itt = fino.FieldType; if (!itt.IsPublic) { continue; } //一般Reserved只放在第一个成员,为加速优化 if (i == 0) { if (itt == typeof(Reserved)) { continue; } } if (itt == typeof(string)) { if (pOut.Length < nIndex + 4) { return(0); } //对进行Html编码 string szValue = (string)poValue; string szFieldNameTemp = sfiarr[i]; //todo if (!string.IsNullOrEmpty(szValue) && (!(szFieldNameTemp == "szPassword" || szFieldNameTemp == "szPasswd" || szFieldNameTemp == "szNewPw" || szFieldNameTemp == "szOldPw" || szFieldNameTemp == "szCurAdminPw"))) { szValue = szValue.Replace("'", "‘"); // szValue = szValue.Replace(";", ";"); szValue = szValue.Replace(",", ","); szValue = szValue.Replace("?", "?"); szValue = szValue.Replace("<", "<"); szValue = szValue.Replace(">", ">"); szValue = szValue.Replace("(", "("); szValue = szValue.Replace(")", ")"); // szValue = szValue.Replace("@", "@"); szValue = szValue.Replace("=", "="); szValue = szValue.Replace("+", "+"); szValue = szValue.Replace("*", "*"); szValue = szValue.Replace("&", "&"); szValue = szValue.Replace("#", "#"); szValue = szValue.Replace("%", "%"); szValue = szValue.Replace("--", "——"); poValue = szValue; } if (poValue != null && (string)poValue != "[NULL]") { UniStruct.UniSZ pValue = new UniStruct.UniSZ((string)poValue); uint2byte((uint)pValue.m_dwType, ref pOut, nIndex); nIndex += 4; if (pOut.Length < nIndex + pValue.Size()) { return(0); } Array.Copy(pValue.Get(), 0, pOut, nIndex, pValue.Size()); nIndex += pValue.Size(); } else { uint2byte((uint)UTFLAG.DEFUNISZTYPE, ref pOut, nIndex); nIndex += 4; } } else if (itt == typeof(uint) || itt == typeof(uint?) || itt.IsEnum || (itt.IsSerializable && !itt.IsArray)) { if (pOut.Length < nIndex + 4) { return(0); } //if (poValue != null && ((uint)poValue != uint.MaxValue)) if (poValue != null) { UniStruct.UniDW pValue = new UniStruct.UniDW((uint)poValue); uint2byte((uint)pValue.m_dwType, ref pOut, nIndex); nIndex += 4; if (pOut.Length < nIndex + 4) { return(0); } uint2byte((uint)pValue.m_dwValue, ref pOut, nIndex); nIndex += 4; } else { uint2byte((uint)UTFLAG.DEFUNIDWTYPE, ref pOut, nIndex); nIndex += 4; } } else { uint nSize = 0; if (itt.IsArray) { CUniStructArrayCS cacs = new CUniStructArrayCS(); object poValue2 = fino.GetValue(srcObj); byte[] bytes = cacs.Export(poValue2, itt); nSize = (uint)bytes.Length; Array.Copy(bytes, 0, pOut, nIndex + 4, nSize); } else { nSize = Export(poValue, true, ref pOut, nIndex + 4, itt); } uint2byte(nSize | (uint)UTFLAG.UTSTREAM | (uint)UTFLAG.UTVALID | (uint)UTFLAG.UTFILL, ref pOut, nIndex); nIndex += 4; nIndex += nSize; } } return(nIndex - _nIndex); }
public uint Import(out object destObj, byte[] pBuffer, uint _nIndex, bool bHavMag, Type objType) { destObj = Activator.CreateInstance(objType); uint nIndex = _nIndex; try { if (pBuffer == null) { throw(new Exception("0")); } Type t = objType; string[] sfiarr = UniWebLib.Struct_ST.GetStructMember(t.Name); if (sfiarr == null) { FieldInfo[] ttfiarr = objType.GetFields(); sfiarr = new string[ttfiarr.Length]; for (int fi = 0; fi < ttfiarr.Length; fi++) { sfiarr[fi] = ttfiarr[fi].Name; } //throw (new Exception("1," + t.Name)); } if (bHavMag) { if (pBuffer.Length < nIndex + 4) { throw(new Exception("2")); } uint nValue = byte2uint(pBuffer, nIndex); nIndex += 4; if (nValue != (uint)UNISMAG.UNISTRUCT) { throw(new Exception("3,nIndex=" + nIndex)); } } uint nCount = (uint)sfiarr.Length; for (uint i = 0; i < nCount; i++) { if (sfiarr[i] == "") { continue; } FieldInfo fino = t.GetField(sfiarr[i]); if (fino == null) { continue; } Type itt = fino.FieldType; if (!itt.IsPublic) { continue; } //一般Reserved只放在第一个成员,为加速优化 if (i == 0) { if (itt == typeof(Reserved)) { continue; } } if (pBuffer.Length < nIndex + 4) { throw(new Exception("4")); } UTFLAG dwFType = (UTFLAG)byte2uint(pBuffer, nIndex); nIndex += 4; //Logger.Trace("Type="+itt.ToString()+",Name="+fino.Name+",dwFType="+dwFType.ToString("x")); if (itt == typeof(string)) { if (((uint)dwFType & (uint)UTFLAG.UTSTREAM) == 0) { throw (new Exception("5," + objType.Name + "." + fino.Name + "(i=" + i.ToString() + ":nIndex=" + nIndex.ToString() + ")类型错误:dwFType=" + dwFType.ToString("x"))); } uint nSize = (uint)(dwFType & (UTFLAG)UTMASK.UTSIZEMASK);; if ((dwFType & UTFLAG.UTFILL) == 0) { nSize = 0; } if (pBuffer.Length < nIndex + nSize) { throw(new Exception("6,pBuffer.Length=" + pBuffer.Length + ",nIndex=" + nIndex + ",dwFType=" + dwFType)); } if (((dwFType & UTFLAG.UTFILL) != 0) && ((dwFType & UTFLAG.UTLOCK) == 0) ) { UniStruct.UniSZ newValue = new UniStruct.UniSZ(); newValue.Set(pBuffer, nIndex, nSize); nIndex += nSize; //todo //对html进行解码 // string newValueTemp = newValue.ToString(); // newValueTemp = System.Web.HttpContext.Current.Server.HtmlDecode(newValueTemp); // fino.SetValueDirect(__makeref(destObj), newValueTemp); fino.SetValueDirect(__makeref(destObj), newValue.ToString()); } else { if (((dwFType & UTFLAG.UTFILL) != 0) && ((dwFType & UTFLAG.UTLOCK) == 0)) { nIndex += nSize; } } } else if (itt == typeof(uint) || itt == typeof(uint?) || itt.IsEnum || (itt.IsSerializable && !itt.IsArray)) { if (((dwFType & UTFLAG.UTFILL) != 0) && ((dwFType & UTFLAG.UTLOCK) == 0) ) { if (pBuffer.Length < nIndex + 4) { throw(new Exception("8")); } uint nValue = byte2uint(pBuffer, nIndex); nIndex += 4; if (itt.IsEnum) { Object enumobj = System.Enum.ToObject(itt, nValue); fino.SetValueDirect(__makeref(destObj), enumobj); } else { fino.SetValueDirect(__makeref(destObj), nValue); } } else { if (((dwFType & UTFLAG.UTFILL) != 0) && ((dwFType & UTFLAG.UTLOCK) == 0)) { nIndex += 4; } } } else { object subobj; uint nSize = (uint)(dwFType & (UTFLAG)UTMASK.UTSIZEMASK); if (nSize > 0) { if (itt.IsArray) { CUniStructArrayCS CSUSA = new CUniStructArrayCS(); if (CSUSA.Import(out subobj, pBuffer, nIndex, itt) != nSize) { // } } else { if (Import(out subobj, pBuffer, nIndex, true, itt) != nSize) { // } } fino.SetValueDirect(__makeref(destObj), subobj); } nIndex += nSize; } } } catch (Exception e) { Logger.Trace("UniStruct.Import faild:" + e.Message + "," + e.ToString()); return(0); } return((uint)nIndex - _nIndex); }