寻求一个快速系列化的方法,要求码流缩小到最低
寻求一个快速系列化的方法,要求码流缩小到最低
我看到的一个码流是使用EDI的方式,也就是分隔符的方式。这种方式的码流已经是非常小了。但是由于循环次数很多,因此速度不快,寻求较快的算法或者其它较好的系列化反系列化方法。
备注下:XML系列化是不可以的,码流太大,不适合我的应用场合,我的这个应用,宁可损失速度也不愿意增大码流。
以下代码是对DataTable进行系列化,仅对部分数据类型进行了支持。形成的报文格式大概是这样的
<DSRoot>
<DSHead>字段名1:类型名称 字段名2:类型名称 ...... 字段名n:类型名称</DSHead>
<DSBody>
<DSRow>字段值1 字段值2 ...... 字段值n</DSRow>
<DSRow>字段值1 字段值2 ...... 字段值n</DSRow>
<DSRow>字段值1 字段值2 ...... 字段值n</DSRow>
</DSBody>
</DSRoot>
public StringBuilder SerializeDS(System.Data.DataTable pDT){ try { StringBuilder mSB = new StringBuilder(); string mSplitChar = System.Text.Encoding.Default.GetString(new byte[] { 0x1E }); mSB.Append("<DSRoot>"); mSB.Append("<DSHead>"); if (pDT.Columns.Count > 0) { mSB.Append(pDT.Columns[0].ColumnName + ":" + pDT.Columns[0].DataType.Name); for (int i = 1; i < pDT.Columns.Count; i++) { mSB.Append(mSplitChar + pDT.Columns[i].ColumnName + ":" + pDT.Columns[i].DataType.Name); } } mSB.Append("</DSHead>"); mSB.Append("<DSBody>"); for (int i = 0; i < pDT.Rows.Count; i++) { mSB.Append("<DSRow>"); if (pDT.Columns.Count > 0) { mSB.Append(GetSerializeString(pDT.Columns[0].DataType, pDT.Rows[i][0])); for (int j = 1; j < pDT.Columns.Count; j++) { mSB.Append(mSplitChar + GetSerializeString(pDT.Columns[j].DataType, pDT.Rows[i][j])); } } mSB.Append("</DSRow>"); } mSB.Append("</DSBody>"); mSB.Append("</DSRoot>"); return mSB; } catch (NullReferenceException NullEx) { throw NullEx; } catch (Exception Ex) { throw Ex; }}private string GetSerializeString(Type pType, object pValue){ try { if (pType == typeof(System.String)) { if (pValue != System.DBNull.Value) { return pValue.ToString(); } else { return ""; } } else if (pType == typeof(System.DateTime)) { try { if (pValue.ToString().Trim() != "") { return ((System.DateTime)pValue).ToString("yyyy-MM-dd HH:mm:ss"); } else { return "1900-01-01"; } } catch { return "1900-01-01"; } } else if ((pType == typeof(System.Int32)) || (pType == typeof(System.Int16)) || (pType == typeof(System.UInt32)) || (pType == typeof(System.UInt16)) || (pType == typeof(System.Decimal)) || (pType == typeof(System.Double)) ) { try { if (pValue.ToString().Trim() != "") { return pValue.ToString(); } else { return "0"; } } catch { return "0"; } } else if (pType == typeof(System.Boolean)) { try { if (pValue.ToString().Trim() != "") { return ((bool)pValue).ToString(); } else { return "false"; } } catch { return "false"; } } else if (pType == typeof(System.Guid)) { try { if (pValue.ToString().Trim() != "") { return ((System.Guid)pValue).ToString(); } else { return System.Guid.Empty.ToString(); } } catch { return System.Guid.Empty.ToString(); } } else if (pType == typeof(System.Byte)) { try { if (pValue.ToString().Trim() != "") { return Convert.ToString(((Byte)pValue), 16).PadLeft(2, '0'); } else { return "00"; } } catch { return "00"; } } else { try { return pValue.ToString(); } catch { return ""; } } } catch (NullReferenceException NullEx) { throw NullEx; } catch (Exception Ex) { throw Ex; }}