我想知道类实例的近似XML序列化大小,而不实际序列化实例。当然,我可以提供一个属性,明确地将所有字段的大小相加,以及将生成的XML标记的填充。然而,(1)我想知道是否已经有一个工具用于此目的 - 可能是扩展方法,如果不是(2)我想知道如何使用反射来近似大小的循环。
现在我正在做这样的事情:
private static readonly int averageTagSize = 20;
[NonSerialized]
public int EventSize
{
get
{
int size = 0;
FieldInfo[] fields = this.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance);
foreach (FieldInfo field in fields)
{
size += averageTagSize;
switch (field.FieldType){
case typeof(int):
size += 32;
break;
case typeof(string):
string temp = field.GetValue(this) as string;
size += temp.Length;
break;
//...and so on
}
}
return 0;
}
}
上面的代码不起作用,因为编译器不会让我打开类型信息。建议?
答案 0 :(得分:1)
使用XML序列化,没有直接的答案,因为大小都取决于使用的XML编写器选项。例如,是否使用行结尾和缩进会对最终文件输出产生影响。
您正在采取的方法可以用于粗略估计。但是,您还必须注意在类,属性和字段上定义的任何属性,这些属性可以控制XML的序列化精确程度。
就switch
语句而言,最直接的替换是使用if..else if..else
块。
答案 1 :(得分:1)
我以前的帖子是错误的。我给出的答案在VB中有效,但在c#中没有。解决此问题的一种方法是硬编码类型名称,如下所示:
switch (field.FieldType.Name)
{
case "Int32":
size += 32;
break;
case "String":
string temp = field.GetValue(this) as string;
size += temp.Length;
break;
}
或者,您可以使用if语句来避免使用硬编码字符串:
foreach (FieldInfo field in fields)
{
size += averageTagSize;
if (field.FieldType.Name == typeof(int).Name)
{
size += 32;
}
else if (field.FieldType.Name == typeof(string).Name)
{
string temp = field.GetValue(this) as string;
size += temp.Length;
}
}
答案 2 :(得分:0)
虽然现有的答案对于您的方法是正确的,只能得出非常粗略的估计,但我相信您当前问题的答案是使用类型的字符串名称。我在家里没有访问c#编译器,但我相信它看起来像这样:
switch (field.FieldType.Name){
case typeof(int).ToString():
.....
我希望有所帮助!