假设我有一个名为的对象data
,其中包含各种信息。让我们说一下,data
图中实际上有很多东西。
如果我使用它进行序列化,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 位操作系统上的 a 上限string
约为 2GB,而 32 位操作系统的上限要小得多。流有这样的限制吗?由于流是以字节块的形式写入的,因此它们不会写入是有道理的。