5

ビューステートに保存する必要のあるオブジェクトがある場合、オブジェクトの保存に必要なサイズを最適化するには、どのようなことができますか?明らかに、最小量のデータを格納することで必要なスペースは少なくなりますが、それ以外に、シリアル化された出力の大きさに影響を与えるクラス、プロパティ、属性などを設計する方法はありますか?

4

2 に答える 2

3

私の基本的なポイント。

  1. クラスと変数に小さい名前を使用するか、[ XmlAttribute ("ME")] コマンドを使用します
  2. 文字列や大きな値の場合、特にデフォルト値を配置しないようにしています。
  3. 保存に勝てない変数には[NonSerialized]を使用します。

また、基本クラス内で追加の List を使用すると、より多くのスペースが必要になることもわかっています。これは、私が言及したポイントをいじるだけで、自分で見ることができるサンプルです。

たとえば、cEnaText からデフォルト値を削除すると、viewstate はそれよりも 50% 小さくなります。[NonSerialized] をすべての変数に配置すると、viewstate は空になります。名前を大きくすると、ビューステートが大きくなります。

[Serializable]
public class MyInts
{
    // this text will stored even if you never used it, Avoid to setup it here.
    public string cEnaText = "Start up text";    

    // a work around for big names, and default text.
    [XmlAttribute("TX")]
    string inside_cEnaTextWorkAroundSolution;    

    // this is not going to saved on xml.
    public string cEnaTextWorkAroundSolution;    
    {
       get
       {
         // here I return a default text that I do not store on xml
         if(string.IsNullOrWhiteSpace(inside_cEnaTextWorkAroundSolution))
            return "This is my default string that I do not won to save";
          else
            return inside_cEnaTextWorkAroundSolution;
       }
       set {inside_cEnaTextWorkAroundSolution = value;}
    } 


    // this is stored, including the class name
    public int MyInt;

    // this is not stored
    public MyInts(int getInt)
    {
        MyInt = getInt;
    }
}

[Serializable]
public class StoreMeAsTest
{
    // this is stored
    public List<MyInts> MyL = new List<MyInts>();

    // keep the name small (not like this one)
    public double cOneMoreVariable;

    // or change the xml attribute name with this command
    [XmlAttribute("ME")]
    public double cOneMoreVariableEvenBigger;

    // this is not stored
    [XmlIgnoreAttribute]
    public List<MyInts> Temporary = new List<MyInts>();


    // this is not stored
    public StoreMeAsTest()
    {
        // create some test data
        for (int i = 0; i < 100; i++)
        {
            MyL.Add(new MyInts(i));
            Temporary.Add(new MyInts(i));
        }
    }

}

public partial class Dokimes_Programming_Performance_ViewStatePerformance : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        StoreMeAsTest StoreMe = new StoreMeAsTest();

        ViewState["MyTestTable"] = StoreMe;
    }
}

実際に保存されているものを確認する方法

ビューステートを読み取ることができるプログラムがいくつかあります。これは、Googleで見つけたものです。

http://www.binaryfortress.com/aspnet-viewstate-helper/

アイデアを得る方法。

この機能を使用して、保存されているものと保存されていないもの、および保存される情報の数を把握できると言います。このトリックを使用すると、最終的にシリアル化されたオブジェクトをテキストで確認できます。

    public static string ObjectToXML(Type type, object obby)
    {
        XmlSerializer ser = new XmlSerializer(type);
        using (System.IO.MemoryStream stm = new System.IO.MemoryStream())
        {
            ser.Serialize(stm, obby);
            stm.Position = 0;
            using (System.IO.StreamReader stmReader = new System.IO.StreamReader(stm))
            {
                string xmlData = stmReader.ReadToEnd();
                return xmlData;
            }
        }
    }

そして、ここで私はこの機能をどのように使用しますか

MyLiteral.Text = ObjectToXML(typeof(StoreMeAsTest), StoreMe);

最後の言葉

オブジェクトとその非常に良い質問を最適化できることを実際にここで尋ねます。次のステップは、おそらくビューステートを圧縮して、転送時に小さくすることです。

于 2010-05-07T11:14:50.790 に答える
0

ビューステートをサーバーに保存できます これをチェックしてください:

サーバー側のビューステート

于 2010-05-08T23:50:36.323 に答える