首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

寻快速系列化的方法,要求码流缩小到最低

2012-06-01 
寻求一个快速系列化的方法,要求码流缩小到最低寻求一个快速系列化的方法,要求码流缩小到最低我看到的一个

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




反系列化的代码就不贴了,同样是循环,对字符串进行分割。
寻求对这个代码改造,改成更快的,或者寻求其它低码流高速稳定的系列化方法。




[解决办法]
XML序列化后Gzip压缩,可以缩小10倍
[解决办法]
探讨
XML序列化后Gzip压缩,可以缩小10倍

[解决办法]
象数据库存储一样定义,这样速度快码流小,缺点是自己处理比较复杂。
例如80年代的dbse,foxpro.
[解决办法]
看楼主的内容,还不如直接JSON呢,然后再ZIP一下,就差不多了
[解决办法]
探讨

XML序列化后Gzip压缩,可以缩小10倍

[解决办法]
思路:哈夫曼编码
[解决办法]
??
fastserilizer国外的一个。是序列化的是二制制的值。感觉楼不是要这方面的。
[解决办法]
如果想缩小码流,还不如直接序列化到二进制文件,xml码流肯定大,
[解决办法]
直接用 json 呀,xml要开始要结束tag,这就多了很多无用的字了。

比如:
<person>
<name>test</name>
</person>

json是:
{name:"test"}

那么就是二进制序列化成binary了。

[解决办法]
这个我们没有啥想法

具体需要测试在知道

通常想法
1.直接序列化并gzip
2.直接二进制序列化
3.json
4.直接序列化,同时把回车换行一类的东西去掉,并gzip
5.转成结构体,并用二进制保存这个结构体

这5种都是我们常用的手法,但是具体没测试过到底谁的字节最少,需要自己测试了

[解决办法]
你还搞什么“<DSRoot>、</DSRoot>”呢?这不是也大么?!
[解决办法]
探讨

象数据库存储一样定义,这样速度快码流小,缺点是自己处理比较复杂。
例如80年代的dbse,foxpro.

[解决办法]
json->zip

热点排行