1

Google と StackOverFlow を検索すると、この質問への参照がたくさん出てきます。たとえば、次のとおりです。

.NETで複雑なオブジェクトのサイズを決定する方法は?

メモリ内のオブジェクトサイズを取得するには?

したがって、最初に、正確な測定値を取得することは一般的に不可能であることを理解していると言わせてください. しかし、私はそれについてそれほど心配していません - 私は絶対的ではなく相対的な価値を与えるものを探しています. したがって、それらがどちらか一方に少しずれていても問題ありません。

複雑なオブジェクト グラフがあります。これは、子供を持つ可能性のある子供を持つ単一の親 (T) で構成されています。グラフ内のすべてのオブジェクトは、同じ基本クラスからのものです。子はリスト T の形式です。

サイズを計算するために、シリアル化方法と安全でない方法の両方を試しました。彼らは異なる答えを出しますが、「相対的な」問題はどちらの場合も同じです。

親オブジェクトのサイズは、子のサイズの合計よりも大きいと仮定しました。これは正しくないことが判明しました。親のサイズを計算しました。次に、子供のサイズを合計します。場合によっては、これは理にかなっているように見えましたが、他の場合には、子の合計が親に対して決定されたサイズをはるかに超えていました。

だから私の質問は、オブジェクトをシリアル化すると、子の合計よりも小さいサイズになる可能性があるという私の単純な仮定はなぜですか。私が思いついた唯一の答えは、シリアル化された各オブジェクトには固定のオーバーヘッドがあり (自明だと思います)、これらの合計が親の「独自のサイズ」を超える可能性があるということです。もしそうなら、私がそれを考慮できるように、そのオーバーヘッドが何であるかを判断する方法はありますか?

ご提案いただきありがとうございます。

編集 申し訳ありませんが、すべてのオブジェクトがシリアル化可能とマークされていると言うのを忘れていました。シリアル化方法は次のとおりです。

var bf = new BinaryFormatter();
            var ms = new MemoryStream();
            bf.Serialize(ms, testObject);
            byte[] array = ms.ToArray();
            return array.Length;
4

1 に答える 1

1

オブジェクトのシリアル化に使用するシリアル化メカニズムに大きく依存します。子要素がシリアル化されていない可能性があります。これが、親のサイズが子の合計よりも小さい (場合によっては個々の子よりも小さい) 理由の 1 つです。

オブジェクトの相対的なサイズを知りたい場合は、グラフ内のすべてのオブジェクトのすべてのフィールドをシリアル化していることを確認してください。

編集:したがって、バイナリフォーマッタを使用している場合は、そのシリアライザーで使用される形式の仕様を調べて、オーバーヘッドを理解する必要があります。形式の仕様は公開されており、http://msdn.microsoft.com/en-us/library/cc236844( prot.20 ).aspxで確認できます。消化するのは簡単ではありませんが、理解するために時間を割いても、各オブジェクトがシリアル化された形式でどれだけのオーバーヘッドを持つかを正確に知ることができます。

于 2012-10-19T16:59:46.663 に答える