Прежде всего, размер вашего файла зависит от 2 вещей (если я понимаю, как работает BinaryFormatter, исправьте меня, если я ошибаюсь):
- Размер фактических значений, которые сериализуются, и
- Имена, используемые для сериализации значений объекта с помощью метода
SerializationInfo.AddValue
, которые хранятся в выходном файле, поэтому значения могут использоваться во время десериализации с тем же именем.
Очевидно, # 1 вызовет самое большое замедление, которое можно уменьшить только путем оптимизации объектов, которые вы пытаетесь сериализовать.
Поскольку вы используете динамические объекты, почти незаметно небольшое увеличение размера, вызванное # 2, неизбежно. Если вы знали типы и имена членов объекта заранее, вы могли бы просто дать каждому члену объекта очень короткое, последовательно определяемое имя («1», «2», «3» и т. Д.) Во время итерации. поверх членов объекта, добавляя их через SerializationInfo.AddValue
. Затем, во время десериализации, вы можете использовать SerializationInfo.GetValue
с тем же последовательно определяемым именем, и десериализация будет работать очень хорошо, независимо от фактических имен десериализованных значений, если вы выполняете итерацию в элементах объекта в том же порядке. они были добавлены. Конечно, это может сэкономить вам в среднем 4 или 5 байт на элемент, но эти небольшие суммы могут сложиться в большие объекты.
@ Рейн: (Полагаю, я мог бы использовать ExpandoObject, но это уже другая история.)
Не так; Я изменил ваш пример кода, чтобы использовать ExpandoObject
вместо вашего Entity
класса, и мне бросили SerializationException
. ExpandoObject
не помечен SerializableAttribute
и не имеет соответствующих конструкторов для десериализации или сериализации. Однако это не означает, что вы не можете использовать ExpandoObject, если вы действительно этого хотите: он реализует IDictionary<string, object>
, который, в свою очередь, реализует ICollection<KeyValuePair<string, object>>
. Таким образом, экземпляр ExpandoObject
является коллекцией экземпляров KeyValuePair<string, object>
, которые помечены как как сериализуемые. Таким образом, вы можете сериализовать ExpandoObject, но вам нужно будет привести его к ICollection<KeyValuePair<string, object>>
и сериализовать каждый KeyValuePair<string, object>
в нем по отдельности. Это было бы бессмысленно, однако, с точки зрения оптимизации исходного кода, поскольку оно занимает столько же места на диске.
Подводя итог, я действительно не думаю, что есть какой-то способ оптимизировать сериализацию динамического объекта - вы должны циклически проходить по элементам объекта каждый раз, когда он сериализуется, и у вас нет возможности узнать размер объекта заранее (по определению динамический).