日期:2014-05-18  浏览次数:20762 次

寻求一个快速系列化的方法,要求码流缩小到最低
寻求一个快速系列化的方法,要求码流缩小到最低
  我看到的一个码流是使用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>

C# code

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
            {