Это очень плохая практика, чтобы сериализовать объект только для того, чтобы получить его размер, если вы планируете сериализовать его позже.
Используйте с осторожностью.
Метод расширения будет применяться ко всем объектам, вы должны проверить, есть ли в нем пользовательское свойство.
Эта проверка может сделать работу.
if (notSuspectingCandidate.GetType().GetCustomAttributes(typeof(SerializableAttribute), true).Length == 0)
{
return -1; // An error
}
Другой способ - добавить метод расширения в ISerializable и использовать интерфейс во всех необходимых типах.
public static int CalculateKilobytes(this ISerializable notSuspectingCandidate)
{
using (MemoryStream stream = new MemoryStream())
{
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, notSuspectingCandidate);
return stream.ToArray().Count() / 1000;
}
}