2010-08-31 43 views
1

我想知道类实例的大致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

你能走了过来每个属性和调用大小?从来没有真正与此有关,但这是我开始 – PostMan 2010-08-31 01:20:50

+0

@PostMan:sizeof地址编译时的大小。它没有计算机的运行时间值(例如我的班级中分配的字符串的长度)。 – 2010-08-31 01:36:23

+0

是的,但是对于字符串的长度来说,它会是'sizeof(char)* string.length'是不正确的? – PostMan 2010-08-31 01:40:39

回答

1

对于XML序列化,没有直接的答案,因为大小完全取决于采用的XML编写器选项。例如,是否使用行结尾和缩进会对最终文件输出产生影响。

您正在采取的方法可用于粗略估计。但是,您还需要注意可以控制XML序列化的类,属性和字段上定义的任何属性。

就您的switch声明而言,最直接的替代方法是使用if..else if..else块。

0

尽管现有的答案对您的方法是正确的,只能得出一个非常粗略的估计,但我相信您的直接问题的答案是使用类型的字符串名称。我没有访问我家的C#编译器,但我相信它看起来像这样:

switch (field.FieldType.Name){ 
       case typeof(int).ToString(): 
        ..... 

我希望有帮助!

+0

交换机只能在case语句中使用contant值。 Ergo,“ToString()”调用无效。 – 2010-08-31 05:30:52

+0

明天我会尽力回复你(我已经安装了VS)。我知道这在VB中是可行的,我也会用C#来假设。至少可以将字符串“硬编码”到switch语句中。 – 2010-09-01 05:34:08

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; 
    } 
} 
相关问题