Если у меня есть объект, я должен сохранить в состоянии отображения, какие виды вещей я могу сделать для оптимизации размера, который оно берет, чтобы хранить объект? Очевидно, хранение наименьшего количества объема данных займет меньше места, но кроме этого, является там способами спроектировать класс, свойства, attrbutes и т.д., который произведет, насколько большой сериализированный вывод?
Есть несколько факторов, которые нужно учитывать. Возможно, вы захотите дать немного больше информации о своем классе, зачем вам нужно его хранить и т. д.
Старый пост здесь, на stackoverflow, используется несколько стратегий оптимизации.
Мои основные положения.
Также я знаю, что если я использую дополнительные 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);
Вы спросите здесь, как мы можем оптимизировать объект, и это очень хороший вопрос. Следующим шагом, вероятно, будет сжатие состояния представления, чтобы сделать его меньше при передаче обратно к нам.
вы можете хранить состояние просмотра на сервере посмотрите здесь: