我创建了一个扩展方法,它会告诉我我创建的每个对象的大小 像这样:
public static int CalculateKilobytes(this object notSuspectingCandidate)
{
using (MemoryStream stream = new MemoryStream())
{
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, notSuspectingCandidate);
return stream.ToArray().Count() / 1000;
}
}
由于我正在使用serializaion,并非所有对象都能够返回答案,只有可序列化的答案。有没有办法将此方法附加到可以序列化的对象?
答案 0 :(得分:0)
您可以使用Type.IsSerializable Property。
public static int CalculateKilobytes(this object notSuspectingCandidate)
{
using (MemoryStream stream = new MemoryStream())
{
BinaryFormatter formatter = new BinaryFormatter();
if (notSuspectingCandidate.GetType().IsSerializable) {
formatter.Serialize(stream, notSuspectingCandidate);
return stream.ToArray().Count() / 1000;
}
return 0;
}
}
答案 1 :(得分:0)
如果您计划稍后再次对其进行序列化,那么将对象序列化只是为了获得它的大小是一个非常糟糕的做法。
谨慎使用。
扩展方法将应用于所有对象,您必须检查其中是否包含自定义属性。
这项检查可以胜任。
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;
}
}