2010-08-31 60 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; 
    } 
}