假设我有一个对象叫做data
,它包含各种信息。让我们假设data
图中实际上有相当多的东西。C#对象序列化的元信息
如果我使用BinaryFormatter
将其序列化,那么我得到一个5Mb的文件。 如果我将序列化流封装在GZipStream
中,那么我会得到一个更小的文件,比如1Mb。
如果需要,我可以在压缩流时加密流,或者在不压缩流的情况下加密流。
问题是:我需要知道在序列化过程中做了什么,以便在反序列化时知道该怎么做。
一种技术是使用不同的文件扩展名。例如,未压缩的未加密文件可能具有.dat扩展名,.zdat用于压缩,.cdat用于加密,.czdat用于压缩和加密。
这会工作,但它引入了一个潜在的问题:如果用户更改扩展名等等。这也意味着如果我想在Windows中关联文件,则有4个扩展名而不是1个,这需要相关联 - 将与现有协会冲突的风险翻两番。
如果我换我的数据对象在一个简单的类:
[Serializable]
public class SerialisationContainer
{
public string SerialisedData { get; private set; }
public bool Compressed { get; private set; }
public bool Encrypted { get; private set; }
public SerialisationContainer()
{
// etc...
}
public object GetObject()
{
// etc...
}
}
然后我基本上连载其中有一个序列化流可以压缩和/或加密的对象,但我们不”因为元信息存储在SerialisationContainer
中,所以此时不知道或小心。
您认为如何?我基本上只是好奇你对这种方法的看法,以及你在类似情况下做了什么。我认为上述方法是一种非常浪费的做我想做的事情的方式。我基本上需要序列化我的数据图到内存流,将其转换为字符串,将字符串放入我的容器中,然后再次将其串行化。
另一个问题是string SerialisedData
的长度。在我给出的例子中,我们只有大约5Gb的BinaryData,但是什么时候它开始变大?我知道在64位操作系统上,string
的上限大约为2GB,而32位操作系统的上限要小得多。流是否有这样的限制?由于数据流是以字节为单位写入的,所以它们不会。
谢谢:)我没有想过写头字节 - 但现在我明白了。他们说事后总是20/20。 – Ozzah 2011-03-30 23:58:08