在我的应用程序中,我从一些XML文件创建了一个相当大的对象。 xml文件大小约为30MB,而我的二进制序列化对象来自这个xml文件将会像8〜9MB一样。有趣的是,如果我使用例如压缩这个二进制文件WinRar,它将只有1〜2MB。作为文件的二进制序列化对象的压缩级别
有没有办法提高对象本身的压缩级别?还是应该在保存或解压缩之前手动编写用于压缩文件的代码,然后再重新加载到程序中来使用另一级别的压缩?
在的情况下,这是我用我的对象保存为文件的代码:
public static bool SaveProject(Project proj, string pathAndName)
{
bool success = true;
proj.FileVersion = CurrentFileVersion;
try
{
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream(pathAndName, FileMode.Create, FileAccess.Write, FileShare.None);
formatter.Serialize(stream, proj);
stream.Close();
}
catch (Exception e)
{
MessageBox.Show("Can not save project!" + Environment.NewLine + "Reason: ", "Error",
MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
success = false;
}
return success;
}
UPDATE 我试图通过增加一个GZIPSTREAM
改变我的代码,但它似乎并不做任何事情!或者,也许我的实施是错误的?
public static bool SaveProject(Project proj, string pathAndName)
{
bool success = true;
proj.FileVersion = CurrentFileVersion;
try
{
IFormatter formatter = new BinaryFormatter();
var stream = new FileStream(pathAndName, FileMode.Create, FileAccess.Write, FileShare.None);
var gZipStream = new GZipStream(stream, CompressionMode.Compress);
formatter.Serialize(stream, proj);
stream.Close();
gZipStream.Close();
}
catch (Exception e)
{
MessageBox.Show("Can not save project!" + Environment.NewLine + "Reason: ", "Error",
MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
success = false;
}
return success;
}
public static Project LoadProject(string path)
{
IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);
var gZipStream = new GZipStream(stream, CompressionMode.Decompress);
var obj = (Project)formatter.Deserialize(gZipStream);
stream.Close();
gZipStream.Close();
if (obj.FileVersion != CurrentFileVersion)
{
throw new InvalidFileVersionException("File version belongs to an older version of the program.");
}
return obj;
}
什么不试试'GZipStream邮编=新GZipStream(流,System.IO.Compression.CompressionMode.Compress); formatter.Serialize(zip,proj);'看看。 –
@ L.B Thaks,我试过但文件大小没有变化!请检查更新! –
你仍然序列化为'stream'。使用'gZipStream' ['* formatter.Serialize(stream,proj);''] –