4

私は何年も前に、ファイル形式についてあまり考えずに.NETアプリケーションを作成しました。これは、soapフォーマッターを使用して、オブジェクトの大きな階層をシリアル化します。汚れが簡単だったので、あまり考えませんでした。

私は現在、次の問題を考慮して、より最適なファイル形式を考え出そうとしています。ファイルが保存されると、最終的にバイト配列に変換され、データベースに送信されて保存されます。すべてのオブジェクトがメモリにあり、シリアライザにさらに多くのメモリを割り当て、次にバイト配列にさらに多くのメモリを割り当てるため、これは大きな問題になります。適度なサイズのオブジェクトグラフでさえ、ファイルの保存を処理するために大量のメモリを使用することになります。

ファイル形式の観点からだけでなく、アルゴリズムの観点からもこれを改善する方法がわかりません(オブジェクト->ストリーム->バイト配列)

更新:私は常にバイト配列をネットワーク経由で送信する前に圧縮していたので、それは良いアドバイスですが、それはすでに私のアプリケーションに実装されていました。

私はSoapからBinarySerializationに変換しましたが、それは大きな違いをもたらしました。ファイルは以前の約7分の1になりました。(もちろん、マイレージは異なる場合があります)。

4

6 に答える 6

4

効率的なシリアル化が必要で、バイナリ形式としてシリアル化されているかどうかを気にしない場合は、.NETの標準のバイナリシリアル化を使用してください。[Serializable]属性でシリアル化可能な型を装飾し、BinaryFormatterを使用してオブジェクトをbyte[]にシリアル化することができます。

于 2009-06-11T02:53:28.583 に答える
3

あなたがそれを試したことがないならば、1つの非常に速い解決策。オーバーヘッドを完全に削減することはできませんが、役立ちます。

オブジェクトをシリアル化するときは、ノードの代わりに属性を使用してください。ノードを使用すると多くの無駄なスペースがあります。プロパティ/フィールドの上に[XmlAttribute]タグを追加することで、これを簡単に実現できます。

参照リンク: http: //msdn.microsoft.com/en-us/library/2baksw0z (VS.71).aspx

于 2009-06-11T02:49:59.010 に答える
3

BinaryFormatter + DeflateStream = 圧縮された永続オブジェクト

using System;
using System.IO;
using System.IO.Compression;
using System.Runtime.Serialization.Formatters.Binary;

namespace CompressedSerialized
{
    class Program
    {
        static void Main(string[] args)
        {
            var obj1 = new MyObject() { Prop1 = "p1", Prop2 = "p2" };
            MyObject obj2 = null;
            var bin = new BinaryFormatter();
            byte[] buffer = null;

            using (var ms = new MemoryStream())
            {
                using (var zip = new DeflateStream(ms, CompressionMode.Compress))
                {
                    bin.Serialize(zip, obj1);
                    zip.Flush();
                }
                buffer = ms.ToArray();
            }

            using (var ms = new MemoryStream(buffer))
            using (var unzip = new DeflateStream(ms, CompressionMode.Decompress))
            {
                var des = bin.Deserialize(unzip);
                obj2 = des as MyObject;
            }

        }
    }

    [Serializable]
    public class MyObject
    {
        public string Prop1 { get; set; }
        public string Prop2 { get; set; }
    }
}
于 2009-06-11T03:06:02.473 に答える
1

圧縮/圧縮されたストリームを使用することもできます。メモリからSharpZipLibを使用すると、圧縮されたストリームを作成できると思います。

于 2009-06-11T02:52:16.150 に答える
0

アプリケーションをXMLからJSONに移行してみませんか?.NETでJSONをシリアル化/逆シリアル化できるライブラリは多数あります。

于 2009-06-11T02:55:30.700 に答える
0

データベースに保存するデータの圧縮にLZMAを使用しました。たとえば、36,000 から 6000 までのものを取得します。使い方は非常に簡単で、データをバイナリとして保存する必要はなく、文字列でもかまいません。

于 2009-06-11T03:03:41.667 に答える