关于DataSet,和对象和byte[]互相转换的疑问?

时间:2021-03-01 11:46:05
在webservice中和客户端传递的除了一些基本类型外,还有对象,对象数组,Dataset,现在用户大多是用无线网卡使用的,反应速度无法接受,我也查了一些资料,提到的最多的是异步调用,压缩数据,我现在正在试验把dataset和对象转换成byte[]传输,客户端在反序列化,我发现好象也没有提高多少,我的代码是:
 

/// <summary>
        /// 将Dataset序列化成byte[]
        /// </summary>
        /// <param name="ds"></param>
        /// <returns></returns>
        public static byte[] DataToByte(DataSet ds)
        {
            byte[] bArrayResult = null;
            ds.RemotingFormat = SerializationFormat.Binary;
            MemoryStream ms = new MemoryStream();
            IFormatter bf = new BinaryFormatter();
            bf.Serialize(ms, ds);
            bArrayResult = ms.ToArray();
            ms.Close();
            ms.Dispose();
            return bArrayResult;
        }

客户端:
 

 /// <summary>
        /// 将byte[]反序列化成Dataset
        /// </summary>
        /// <param name="bArrayResult"></param>
        /// <returns></returns>
        public static DataSet ByteToDataset(byte[] bArrayResult)
        {
            DataSet dsResult = null;
            MemoryStream ms = new MemoryStream(bArrayResult);
            IFormatter bf = new BinaryFormatter();
            object obj = bf.Deserialize(ms);
            dsResult = (DataSet)obj;
            ms.Close();
            ms.Dispose();
            return dsResult;
        }

========================================================================
问题:请问有过经验的大哥,这种方法能提高多少传输效率吗?
还有对象数组怎么转换成byte[]?
TKS!

13 个解决方案

#1


序列化对象的方法:

public static byte[] Serialize(object aObject)
        {
            //序列化发送内容
            MemoryStream aMemoryStream = new MemoryStream();
            BinaryFormatter aBinaryFormatter = new BinaryFormatter();
            aBinaryFormatter.Serialize(aMemoryStream, aObject);
            
            return aMemoryStream.ToArray();
        }

另外,你这样并不能提高太多的传输效率

无线网络如果掉包率很高,应该从传输协议的角度来注重考虑

#2


如果要提高传输效率怎么做呢?能否在压缩下

#3


怎么没有人呢?

#4


可以壓縮的。

#region 壓縮,解壓
    public static byte[] SerializationDataset(DataSet dsDataSet)//對數據集進行序列化並壓縮
    {
        dsDataSet.RemotingFormat = SerializationFormat.Binary;
        MemoryStream MS = new MemoryStream();
        IFormatter BF = new BinaryFormatter();
        MS.Position = 0;
        C1ZStreamWriter CZ = new C1ZStreamWriter(MS);
        BF.Serialize(CZ, dsDataSet);
        Byte[] B = MS.ToArray();
        return B;
    }

    public static  DataSet DecompressDS(byte[] byt)//對數據集進行解壓縮並反序列化
    {
        DataSet DS = new DataSet();
        MemoryStream ms = new MemoryStream(byt);
        C1ZStreamReader CR = new C1ZStreamReader(ms);
        IFormatter BF = new BinaryFormatter();
        object OB = BF.Deserialize(CR);

        DS = (DataSet)OB;
        return DS;
    }
    #endregion

#5


using C1.C1Zip;

#6


还有一个问题,对象数组怎么转换成byte[]呢?

#7


dataset ds = new dataset();
byte[] byte = (byte[])ds.table[0];

#8


是对象数组,不是byte[]
比如:Class1[] c=new Class1[3];
怎么把转换为byte[]?

#9


对象数组 可以放在一个LIST里,就可以作为一个对象进行压缩了

//如果要提高传输效率怎么做呢?

看你用什么协议,一般的HTTP和TCP协议网络中间断线后,就需要重新传输
如果使用支持断点续传的方式就比较好

对于一般的数据而言(数据包小而数量很多)如果你不是专门搞网络传输的就没有必要了

#10


mark

#11


可以壓縮的。

#region   壓縮,解壓
        public   static   byte[]   SerializationDataset(DataSet   dsDataSet)//對數據集進行序列化並壓縮
        {
                dsDataSet.RemotingFormat   =   SerializationFormat.Binary;
                MemoryStream   MS   =   new   MemoryStream();
                IFormatter   BF   =   new   BinaryFormatter();
                MS.Position   =   0;
                C1ZStreamWriter   CZ   =   new   C1ZStreamWriter(MS);
                BF.Serialize(CZ,   dsDataSet);
                Byte[]   B   =   MS.ToArray();
                return   B;
        }

        public   static     DataSet   DecompressDS(byte[]   byt)//對數據集進行解壓縮並反序列化
        {
                DataSet   DS   =   new   DataSet();  
                MemoryStream   ms   =   new   MemoryStream(byt);
                C1ZStreamReader   CR   =   new   C1ZStreamReader(ms);
                IFormatter   BF   =   new   BinaryFormatter();
                object   OB   =   BF.Deserialize(CR);

                DS   =   (DataSet)OB;
                return   DS;
        }
        #endregion 


哪里是解压和压缩的代码?

#12


换千兆网卡,百兆千兆网卡就是在底层对数据压缩才提速的。也就是说你没必要压缩了

#13


up

#1


序列化对象的方法:

public static byte[] Serialize(object aObject)
        {
            //序列化发送内容
            MemoryStream aMemoryStream = new MemoryStream();
            BinaryFormatter aBinaryFormatter = new BinaryFormatter();
            aBinaryFormatter.Serialize(aMemoryStream, aObject);
            
            return aMemoryStream.ToArray();
        }

另外,你这样并不能提高太多的传输效率

无线网络如果掉包率很高,应该从传输协议的角度来注重考虑

#2


如果要提高传输效率怎么做呢?能否在压缩下

#3


怎么没有人呢?

#4


可以壓縮的。

#region 壓縮,解壓
    public static byte[] SerializationDataset(DataSet dsDataSet)//對數據集進行序列化並壓縮
    {
        dsDataSet.RemotingFormat = SerializationFormat.Binary;
        MemoryStream MS = new MemoryStream();
        IFormatter BF = new BinaryFormatter();
        MS.Position = 0;
        C1ZStreamWriter CZ = new C1ZStreamWriter(MS);
        BF.Serialize(CZ, dsDataSet);
        Byte[] B = MS.ToArray();
        return B;
    }

    public static  DataSet DecompressDS(byte[] byt)//對數據集進行解壓縮並反序列化
    {
        DataSet DS = new DataSet();
        MemoryStream ms = new MemoryStream(byt);
        C1ZStreamReader CR = new C1ZStreamReader(ms);
        IFormatter BF = new BinaryFormatter();
        object OB = BF.Deserialize(CR);

        DS = (DataSet)OB;
        return DS;
    }
    #endregion

#5


using C1.C1Zip;

#6


还有一个问题,对象数组怎么转换成byte[]呢?

#7


dataset ds = new dataset();
byte[] byte = (byte[])ds.table[0];

#8


是对象数组,不是byte[]
比如:Class1[] c=new Class1[3];
怎么把转换为byte[]?

#9


对象数组 可以放在一个LIST里,就可以作为一个对象进行压缩了

//如果要提高传输效率怎么做呢?

看你用什么协议,一般的HTTP和TCP协议网络中间断线后,就需要重新传输
如果使用支持断点续传的方式就比较好

对于一般的数据而言(数据包小而数量很多)如果你不是专门搞网络传输的就没有必要了

#10


mark

#11


可以壓縮的。

#region   壓縮,解壓
        public   static   byte[]   SerializationDataset(DataSet   dsDataSet)//對數據集進行序列化並壓縮
        {
                dsDataSet.RemotingFormat   =   SerializationFormat.Binary;
                MemoryStream   MS   =   new   MemoryStream();
                IFormatter   BF   =   new   BinaryFormatter();
                MS.Position   =   0;
                C1ZStreamWriter   CZ   =   new   C1ZStreamWriter(MS);
                BF.Serialize(CZ,   dsDataSet);
                Byte[]   B   =   MS.ToArray();
                return   B;
        }

        public   static     DataSet   DecompressDS(byte[]   byt)//對數據集進行解壓縮並反序列化
        {
                DataSet   DS   =   new   DataSet();  
                MemoryStream   ms   =   new   MemoryStream(byt);
                C1ZStreamReader   CR   =   new   C1ZStreamReader(ms);
                IFormatter   BF   =   new   BinaryFormatter();
                object   OB   =   BF.Deserialize(CR);

                DS   =   (DataSet)OB;
                return   DS;
        }
        #endregion 


哪里是解压和压缩的代码?

#12


换千兆网卡,百兆千兆网卡就是在底层对数据压缩才提速的。也就是说你没必要压缩了

#13


up