// 压缩
private void Compress(Stream source, Stream dest) {
using (GZipStream zipStream = new GZipStream(dest, CompressionMode.Compress, true)) {
byte[] buf = new byte[1024];
int len;
while ((len = source.Read(buf, 0, buf.Length)) > 0) {
zipStream.Write(buf, 0, len);
}
}
}
// 解压
private void Decompress(Stream source, Stream dest) {
using (GZipStream zipStream = new GZipStream(source, CompressionMode.Decompress, true)) {
byte[] buf = new byte[1024];
int len;
while ((len = zipStream.Read(buf, 0, buf.Length)) > 0) {
dest.Write(buf, 0, len);
}
}
}
示例:
internal void ExportPackage(string filename, string expression, Stream recordStream, string postscript) {
short version = 1;
using (MemoryStream stream = new MemoryStream()) {
// 写入版本号
StoreBase.WriteValue(stream, version);
// 写入数据实体
byte[] dataBytes = ObjectHelper.Serialize(this.ActiveObject);
StoreBase.WriteValue(stream, dataBytes);
// 写入函数
StoreBase.WriteValue(stream, _functionDeclares.Count);
foreach (string typeName in _functionDeclares.Keys) {
StoreBase.WriteValue(stream, typeName);
StoreBase.WriteValue(stream, _functionDeclares[typeName].Count);
foreach (FuncDescrption func in _functionDeclares[typeName]) {
StoreBase.WriteValue(stream, func.FuncName);
StoreBase.WriteValue(stream, func.NameParams);
StoreBase.WriteValue(stream, func.Descrption);
}
}
// 写入表达式
StoreBase.WriteValue(stream, expression);
// 写入执行历史
byte[] recordBytes = new byte[recordStream.Length];
recordStream.Read(recordBytes, 0, recordBytes.Length);
StoreBase.WriteValue(stream, recordBytes);
// 写入调试附言
StoreBase.WriteValue(stream, postscript);
// 压缩
stream.Position = 0;
using (FileStream fs = new FileStream(filename, FileMode.Create)) {
Compress(stream, fs);
}
}
}
internal void ImportPackage(string filename, LoadPackageEventHandler handler) {
short version = 1;
using (MemoryStream stream = new MemoryStream()) {
// 解压缩
using (FileStream fs = new FileStream(filename, FileMode.Open)) {
Decompress(fs, stream);
}
stream.Position = 0;
// 读取版本号
version = StoreBase.ReadValue(stream, version);
// 读取数据实体
byte[] dataBytes = StoreBase.ReadValue(stream, new byte[0]);
this.ActiveObject = ObjectHelper.Deserialize(dataBytes);
// 读取函数
_functionDeclares.Clear();
int typeCount = StoreBase.ReadValue(stream, (int)0);
for (int i = 0; i < typeCount; i++) {
string typeName = StoreBase.ReadValue(stream, string.Empty);
int funcCount = StoreBase.ReadValue(stream, (int)0);
string funcName = string.Empty;
string nameParams = string.Empty;
string descrption = string.Empty;
for (int j = 0; j < funcCount; j++) {
funcName = StoreBase.ReadValue(stream, funcName);
nameParams = StoreBase.ReadValue(stream, nameParams);
descrption = StoreBase.ReadValue(stream, descrption);
this.AddFunctionDeclare(typeName, funcName, nameParams, descrption);
}
}
// 读取表达式
string expression = StoreBase.ReadValue(stream, string.Empty);
// 读取执行历史
byte[] recordBytes = StoreBase.ReadValue(stream, new byte[0]);
MemoryStream recordStream = new MemoryStream();
recordStream.Write(recordBytes, 0, recordBytes.Length);
recordStream.Position = 0;
// 读取调试附言
string postscript = StoreBase.ReadValue(stream, string.Empty);
handler(expression, recordStream, postscript);
}
}