data
さまざまな情報を含む というオブジェクトがあるとします。data
議論のために、グラフ内には実際にはかなり多くのものがあるとしましょう。
を使用してシリアル化するBinaryFormatter
と、たとえば 5Mb のファイルが得られます。シリアライゼーション ストリームを にカプセル化するとGZipStream
、はるかに小さなファイル、たとえば 1Mb が得られます。
必要に応じて、ストリームを圧縮しながら暗号化することも、ストリームを圧縮せずに暗号化することもできます。
問題は、デシリアライズするときに何をすべきかを知るために、シリアライズ中に何が行われたかを知る必要があることです。
1 つの手法は、別のファイル拡張子を使用することです。たとえば、圧縮も暗号化もされていないファイルの拡張子は、.dat で、圧縮されている場合は .zdat、暗号化されている場合は .cdat、圧縮および暗号化されている場合は .czdat になります。
これは機能しますが、潜在的な問題が発生します。ユーザーが拡張子を変更した場合などです。これは、Windows でファイルを関連付ける場合、関連付ける必要がある拡張子が 1 つではなく 4 つあることも意味します。既存の関連付けとの衝突のリスク。
データ オブジェクトを単純なクラスでラップすると、次のようになります。
[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
。
どう思いますか?私は基本的に、あなたがこの方法についてどう思うか、また同様の状況であなたが何をしているのかに興味があります. 上記の方法は、私がやりたいことをするのに非常に無駄な方法だと思います。基本的に、データ グラフをメモリ ストリームにシリアル化し、それを文字列に変換し、その文字列をコンテナー内に配置してから、再度シリアル化する必要があります。
もう 1 つの問題は、長さですstring SerialisedData
。私が示した例では、約 5Gb の BinaryData しかありませんが、それが大きくなり始めるとどうなるでしょうか? 64 ビット OSでの上限string
は約 2GB で、32 ビット OS ではそれよりも大幅に少ないことがわかっています。ストリームにはそのような制限がありますか? ストリームはバイトのブロックで書き込まれるため、そうしないのは理にかなっています。