可序列化类的近似大小

时间:2010-08-31 01:13:01

标签: c# .net reflection serialization

我想知道类实例的近似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;
        }

    }

上面的代码不起作用,因为编译器不会让我打开类型信息。建议?

3 个答案:

答案 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():
                     .....

我希望有所帮助!