C# 可序列化类的近似大小
我想知道类实例的近似XML序列化大小,而不实际序列化实例。当然,我可以提供一个属性,将所有字段的大小显式相加,并填充将生成的XML标记。然而,(1)我想知道是否已经有一种工具可以达到这个目的——也许是一种扩展方法,如果没有(2)我想知道如何使用反射来制作一个近似大小的循环 现在我正在做这样的事情:C# 可序列化类的近似大小,c#,.net,reflection,serialization,C#,.net,Reflection,Serialization,我想知道类实例的近似XML序列化大小,而不实际序列化实例。当然,我可以提供一个属性,将所有字段的大小显式相加,并填充将生成的XML标记。然而,(1)我想知道是否已经有一种工具可以达到这个目的——也许是一种扩展方法,如果没有(2)我想知道如何使用反射来制作一个近似大小的循环 现在我正在做这样的事情: private static readonly int averageTagSize = 20; [NonSerialized] public int EventSize
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;
}
}
switch (field.FieldType.Name){
case typeof(int).ToString():
.....
上面的代码不起作用,因为编译器不允许我打开类型信息。建议?对于XML序列化,没有直接的答案,因为大小完全取决于所使用的XML编写器选项。例如,是否使用行尾和缩进会对最终文件输出产生影响 你所采取的方法可以用于粗略估计。但是,您还必须注意在类、属性和字段上定义的任何属性,这些属性可以控制XML的序列化方式
就您的
switch
语句而言,最直接的替代方法是使用if..else if..else
块。虽然现有的答案对于您的方法是正确的,只产生了一个非常粗略的估计,但我相信您的直接问题的答案是使用类型的字符串名称。我家里没有c#编译器,但我相信它会是这样的:
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;
}
}
switch (field.FieldType.Name){
case typeof(int).ToString():
.....
我希望这有帮助 我以前的帖子是错误的。我给出的答案在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;
}
}
你能检查一下每一处房产并打电话给sizeof吗?从来没有真正与此有关,但这是我想要的start@PostMan:sizeof地址编译时大小。它不计算运行时值(如我的类中指定的字符串长度)。是的,但对于字符串长度,它将是
sizeof(char)*string。长度是否不正确?您可以使用字段长度长度而不是平均标记大小-将有开始标记和结束标记,提供大约两倍的字符大小。此外,int的大小最多为10-11个字符(位数)。开关只能在case语句中使用contant值。因此,“ToString()”调用无效。我将尝试明天下班(我安装了VS)后给您回复。我知道这在VB中是可能的,我也会假设使用C#。至少可以将字符串“硬编码”到switch语句中。