Хранение строк в UTF8:
byte[] asciiStr = System.Text.Encoding.UTF8.GetBytes("asdf");
string text = System.Text.Encoding.UTF8.GetString(asciiStr);
(редактировать: сначала думал, что ASCII хотел)
Идея 1 : Если вы ожидаете, что большинство значений выиграло 'Чтобы заполнить большую часть времени, вы можете хранить каждое поле в отдельной структуре данных поиска значений ключей - словарь, упорядоченный список с двоичным поиском, двоичное дерево и т. д. Упорядоченный список с двоичным поискомвероятно, будет наиболее эффективным с точки зрения пространства, хотя поиск будет O (log n).
Так что вместо объектов MyObject [] у вас будет
Dictionary<int, string> names; // or List<Tuple<int,string>> names;
Dictionary<int, object> tags;
Dictionary<int, DateTime> datetime1s;
...
Где ключ int в каждомзначение - это идентификатор записи.
Идея 2 : Если вы уверены, что эти DateTimes находятся в разумно небольшом диапазоне (около 30 лет), скажем, с 1 января 2010 года, выможет преобразовать его в 32-битное значение типа int, представляющее, сколько секунд прошло с / до этой даты.Это сократит 4 байта на DateTime.
Идея 3 : Вы могли бы подумать о создании действительно компактной схемы сериализации, где первый байт каждого поля указывает, какое поле в классепоследующие байты сохраняются.Строковые значения могут быть просто разделены символом \ n или чем-то еще.Сохраните все это в байтовом массиве и десериализуйте его по требованию.
Так что-то вроде этого, без пробелов и в двоичных значениях, где это необходимо:
1 //indicates field 1 (Name)
beck.asf\n //the value
6 //indicates field 6 (Num1)
3545623 //the value, in a 64-bit binary int
Если тег ссылаетсядля живого объекта вам может понадобиться просто добавить это в структуру-оболочку отдельно от сериализации.Или, как в первой идее, вы можете хранить только целое число, идентифицирующее тег, а затем иметь List> снаружи, который содержит фактические ссылки на теги.