![]()
using System;
![]()
using System.Data;
using
System.Runtime.Serialization;
using
System.Runtime.Serialization.Formatters.Binary;
![]()
using System.IO;
![]()
using System.IO.Compression;
![]()
using System.Collections.Generic;
![]()
using System.Linq;
![]()
using System.ServiceModel;
![]()
using System.Text;
namespace Wcf_MassData
![]()
{
![]()
public class DataTransfers : IDataTransfers
![]()
{
![]()
/// <summary>
![]()
/// 无参数构造函数
![]()
/// </summary>
![]()
public DataTransfers()
![]()
{
InitBuffers(InitTestDataSet());
![]()
}
private byte[] buffer_all = null;
![]()
private byte[] buffer_currect = null;
![]()
private int get_buffer_length = 1000;
![]()
private long remain_length;
![]()
private MemoryStream stream;
![]()
/// <summary>
![]()
/// 生成一个测试的数据集
![]()
/// </summary>
![]()
/// <returns></returns>
![]()
private DataSet InitTestDataSet()
![]()
{
![]()
DataSet ds = new DataSet( "test");
![]()
DataTable table = new DataTable( "test");
![]()
DataColumn column = new DataColumn( "test");
![]()
column.DataType = Type.GetType( "System.String");
![]()
table.Columns.Add(column);
![]()
DataRow row;
![]()
for ( int i = 0; i < 10000; i++)
![]()
{
![]()
row = table.NewRow();
![]()
row[ "test"] = "测试数据 "+(i+1);
![]()
table.Rows.Add(row);
![]()
}
ds.Tables.Add(table);
return ds;
}
![]()
/// <summary>
![]()
/// 初始化压缩字节流
![]()
/// </summary>
![]()
/// <param name="ds"></param>
![]()
private byte[] InitBuffers(DataSet ds)
![]()
{
IFormatter formatter = new BinaryFormatter();
![]()
MemoryStream stream_ = new MemoryStream();
![]()
formatter.Serialize(stream_, ds);
![]()
buffer_all = stream_.ToArray();
![]()
stream_.Close();
![]()
byte[] bytes_c = Compression(buffer_all, CompressionMode.Compress);
![]()
stream = new MemoryStream(bytes_c);
![]()
stream.Position = 0;
![]()
remain_length = stream.Length;
![]()
return bytes_c;
![]()
}
![]()
/// <summary>
![]()
/// 提供内部使用压缩字流的方法
![]()
/// </summary>
![]()
/// <param name="data"></param>
![]()
/// <param name="mode"></param>
![]()
/// <returns></returns>
![]()
private byte[] Compression( byte[] data, CompressionMode mode)
![]()
{
![]()
DeflateStream zip = null;
![]()
try
![]()
{
![]()
if (mode == CompressionMode.Compress)
![]()
{
![]()
MemoryStream ms = new MemoryStream();
![]()
zip = new DeflateStream(ms, mode, true);
![]()
zip.Write(data, 0, data.Length);
![]()
zip.Close();
![]()
return ms.ToArray();
![]()
}
![]()
else
![]()
{
![]()
MemoryStream ms = new MemoryStream();
![]()
ms.Write(data, 0, data.Length);
![]()
ms.Flush();
![]()
ms.Position = 0;
![]()
zip = new DeflateStream(ms, mode, true);
![]()
MemoryStream os = new MemoryStream();
![]()
int SIZE = 1024;
![]()
byte[] buf = new byte[SIZE];
![]()
int l = 0;
![]()
do
![]()
{
![]()
l = zip.Read(buf, 0, SIZE);
![]()
if (l == 0) l = zip.Read(buf, 0, SIZE);
![]()
os.Write(buf, 0, l);
![]()
} while (l != 0);
![]()
zip.Close();
![]()
return os.ToArray();
![]()
}
![]()
}
![]()
catch
![]()
{
![]()
if (zip != null) zip.Close();
![]()
return null;
![]()
}
![]()
finally
![]()
{
![]()
if (zip != null) zip.Close();
![]()
}
![]()
}
IDataTransfers 成员 #region IDataTransfers 成员
![]()
/// <summary>
![]()
/// 获取所有字节流
![]()
/// </summary>
![]()
/// <returns></returns>
![]()
public byte[] GetAllBuffer()
![]()
{
![]()
if (buffer_all != null)
![]()
return buffer_all;
![]()
else return null;
![]()
}
![]()
/// <summary>
![]()
/// 设置压缩后字节流分块,每一块的大小
![]()
/// </summary>
![]()
/// <param name="length"></param>
![]()
public void SetBufferLength( int length)
![]()
{
![]()
this.get_buffer_length = length;
![]()
}
![]()
/// <summary>
![]()
/// 读取压缩后字节流一块,并提升字节流的位置
![]()
/// </summary>
![]()
/// <returns></returns>
![]()
public bool ReadNextBuffer()
![]()
{
![]()
bool bo;
![]()
if (remain_length > 0)
![]()
{
![]()
if (remain_length > get_buffer_length)
![]()
{
![]()
buffer_currect = new byte[get_buffer_length];
stream.Read(buffer_currect, 0, get_buffer_length);
![]()
remain_length -= get_buffer_length;
![]()
}
![]()
else
![]()
{
![]()
buffer_currect = new byte[remain_length];
![]()
stream.Read(buffer_currect, 0, ( int)remain_length);
![]()
remain_length = 0;
![]()
}
bo = true;
![]()
}
![]()
else
![]()
bo = false;
![]()
return bo;
}
![]()
/// <summary>
![]()
/// 获取当前块的字节流
![]()
/// </summary>
![]()
/// <returns></returns>
![]()
public byte[] GetCurrentBuffer()
![]()
{
![]()
//if (buffer_currect != null)
![]()
// return buffer_currect;
![]()
//else
![]()
// return null;
![]()
DataSet ds = InitTestDataSet();
![]()
byte[] b = InitBuffers(ds);
![]()
return b;
![]()
}
![]()
#endregion
![]()
}
![]()
}