0

現在、クラスUsageDataをバイト配列に保存し、ハードウェア キーに保存する作業を行っています。このハードウェア キーには、ユーザー データ用に最大 256 バイトが予約されています。現在、プロパティで満たされたクラスのサイズは約 640 バイトで、既に圧縮されています。UsageDataTempここで、プロパティ/フィールドなしで一時的なクラスを作成しました。バイト配列が値なしでどれだけ大きいかを確認するテストを実行すると、すでに 220 バイトのサイズがあり、あと 36 バイトしか残っていません。

    [Serializable]
    public class UsageDataTemp
    {
        public byte[] ToByteArray()
        {
            var formatter = new BinaryFormatter();
            using (var stream = new MemoryStream())
            {
                //original serialization is 684 bytes long, compress it with the gzipstream
                using (var compressionStream = new GZipStream(stream, CompressionMode.Compress))
                {
                    formatter.Serialize(compressionStream, this);
                    compressionStream.Flush();
                    return stream.ToArray();
                }
            }
        }
    }

値のない空のクラスが、それ自体を保存するためにすでに 220 バイトを必要とするのはなぜですか。また、バイト配列をさらに圧縮する方法はありますか。それとも、自分で作成を開始する必要がありますかBinaryFormatter

4

3 に答える 3

2

シリアライザー/デシリアライザーに、処理しているオブジェクトのタイプを伝えません。何でも渡すことができ、「動作するはず」です。

これは、逆シリアル化されているオブジェクトの型を特定するために、何らかの型情報をバイナリ ストリームに格納する必要があることを意味します。これは、220 バイトのオーバーヘッドを簡単に (私が思うに) 説明できます。


すべてのバイトが重要な場合は、バイナリ シリアライザーなどの一般的なメカニズムを使用するのではなく、必要なデータを最小限の表現に変換する独自のコードを作成する必要があります。

于 2012-10-17T10:45:50.443 に答える
1

値のない空のクラスがそれ自体を保存するためにすでに 220 バイトを必要とするのはなぜですか?

なぜあなたが見つけられることを尋ねるのですか?このコードはすでに 33 バイトを生成します。

FileStream fs = new FileStream("Serialized.dat", FileMode.Create);
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(fs, "FooString");

文字列自体だけでなく、より多くのシリアル化が行われているためです。オブジェクトをシリアル化すると、そのクラス定義 (およびオブジェクトが含まれるアセンブリ) もシリアル化されます。このクラスのインスタンスをシリアル化:

[Serializable]
class Foo
{
    public String FooString { get; set; }
}

コストは 166 バイトですが、FooStringプロパティには以前にシリアル化された生の文字列と同じデータが含まれています。

したがって、独自のシリアライゼーション (またはロード/保存) ロジックを記述します。そのデータを読み書きするのはあなたなので、たとえば、クラスの特定のプロパティに、スペース内の特定のバイトを割り当てることができます。

于 2012-10-17T10:56:06.493 に答える
0

構造をシリアル化する必要はありません。必要なのは、ハードウェアキーにバイトを格納することだけです。Object Factoryパターンを使用して、256バイトの配列がUsageDataオブジェクトを構築するものと、UsageDataオブジェクトから256バイトの配列を取得するものを実装できます。

于 2012-10-17T10:50:41.797 に答える