C# 可序列化类的近似大小

C# 可序列化类的近似大小,c#,.net,reflection,serialization,C#,.net,Reflection,Serialization,我想知道类实例的近似XML序列化大小,而不实际序列化实例。当然,我可以提供一个属性,将所有字段的大小显式相加,并填充将生成的XML标记。然而,(1)我想知道是否已经有一种工具可以达到这个目的——也许是一种扩展方法,如果没有(2)我想知道如何使用反射来制作一个近似大小的循环 现在我正在做这样的事情: private static readonly int averageTagSize = 20; [NonSerialized] public int EventSize

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

    }
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语句中。