Как оптимизировать класс для состояния отображения

Если у меня есть объект, я должен сохранить в состоянии отображения, какие виды вещей я могу сделать для оптимизации размера, который оно берет, чтобы хранить объект? Очевидно, хранение наименьшего количества объема данных займет меньше места, но кроме этого, является там способами спроектировать класс, свойства, attrbutes и т.д., который произведет, насколько большой сериализированный вывод?

5
задан skaffman 6 May 2010 в 20:12
поделиться

3 ответа

Есть несколько факторов, которые нужно учитывать. Возможно, вы захотите дать немного больше информации о своем классе, зачем вам нужно его хранить и т. д.

Старый пост здесь, на stackoverflow, используется несколько стратегий оптимизации.

Оптимизация ViewState

0
ответ дан 15 December 2019 в 06:19
поделиться

Мои основные положения.

  1. Я использую маленькие имена для классов и переменных, или использую команду [XmlAttribute("ME")]
  2. Я стараюсь не ставить значения по умолчанию, особенно если они строковые и большие.
  3. Я использую [NonSerialized] для переменных, которые я не хочу хранить.

Также я знаю, что если я использую дополнительные List внутри моего базового класса, они занимают гораздо больше места. Вот пример, который вы можете увидеть сами, просто поиграв с пунктами, которые я упомянул.

Например, если убрать из cEnaText значение по умолчанию, то viewstate станет на 50% меньше, чем с ним. Если поставить [NonSerialized] на все переменные, то состояние просмотра будет пустым. Если сделать имя больше, то состояние просмотра увеличивается.

[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;
    }
}

Как посмотреть, что на самом деле хранится

Есть несколько программ, с помощью которых можно прочитать viewstate, вот одна, которую я нашел в гугле.

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);

Заключительные слова

Вы спросите здесь, как мы можем оптимизировать объект, и это очень хороший вопрос. Следующим шагом, вероятно, будет сжатие состояния представления, чтобы сделать его меньше при передаче обратно к нам.

3
ответ дан 15 December 2019 в 06:19
поделиться

вы можете хранить состояние просмотра на сервере посмотрите здесь:

Server Side Viewstate

0
ответ дан 15 December 2019 в 06:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: