Avatar billede r9 Nybegynder
17. december 2003 - 13:24 Der er 22 kommentarer og
1 løsning

Object size

Findes der en let måde at se hvor mange bytes et object i C# fylder?

(unden at streame det til en fil)
Avatar billede Slater Ekspert
17. december 2003 - 13:28 #1
sizeof?
Avatar billede arne_v Ekspert
17. december 2003 - 13:29 #2
Marshal.SizeOf() måske ?
Avatar billede r9 Nybegynder
17. december 2003 - 13:31 #3
sizeof findes ikke på "obejct".

Jeg skal bruge det på alle objecter.
Avatar billede r9 Nybegynder
17. december 2003 - 13:31 #4
arne_v:

prøver lige..
Avatar billede driis Nybegynder
17. december 2003 - 13:35 #5
sizeof kan kun bruges i unsafe kode i C#. Alternativt findes:
System.Runtime.InteropServices.Marshal.SizeOf
Avatar billede r9 Nybegynder
17. december 2003 - 13:47 #6
Marshal.SizeOf()  kaster denne exception:
"Type myObject can not be marshaled as an unmanaged structure; no meaningful size or offset can be computed."
Avatar billede r9 Nybegynder
17. december 2003 - 13:47 #7
myObject er Managed C# kode
Avatar billede arne_v Ekspert
17. december 2003 - 15:55 #8
Er klassen serializable ?
Avatar billede r9 Nybegynder
17. december 2003 - 19:05 #9
ja den er serializable
Avatar billede arne_v Ekspert
17. december 2003 - 20:37 #10
Mystisk.

Hvis en klasse er serializable burde Marshal.SizeOf også virke.

Kan du komme med et eksempel på en klasse som giver problemet ?
Avatar billede r9 Nybegynder
18. december 2003 - 20:00 #11
Arne v:

Fejlen kommer f.eks. på denne klasse:

using System;
using System.Runtime.InteropServices;

namespace TestCode
{
    [Serializable]
    public class Class1
    {
        private string str = "";
        public Class1()
        {
            //
            // TODO: Add constructor logic here
            //
        }
    }
}



------
Class1 cl = new Class1();
int i = System.Runtime.InteropServices.Marshal.SizeOf(cl);
Avatar billede r9 Nybegynder
18. december 2003 - 20:08 #12
denne fejler også:
int i = System.Runtime.InteropServices.Marshal.SizeOf(cl.GetType());



men denne virker:
int i = System.Runtime.InteropServices.Marshal.SizeOf(Type.GetType("System.Byte"));
Avatar billede r9 Nybegynder
18. december 2003 - 20:33 #13
Arne:

Dette virker, men jeg ved ikke om det er korrekt resultat.
"Length" er jo længden i bytes på streamen, og ikke på mit object.

Nogle ideer?

Stream myStream  = new MemoryStream();
            if (myStream != null)
            {
                IFormatter formatter = new BinaryFormatter();               
                formatter.Serialize(myStream, cl);
                Console.Write("size: " + myStream.Length);
                myStream.Close();               
            }
Avatar billede arne_v Ekspert
18. december 2003 - 20:35 #14
Jeg sidder og brygger på noget.
Avatar billede arne_v Ekspert
18. december 2003 - 20:44 #15
Det her compiler og kører, men er nok ret langt fra hvad du søger:

using System;
using System.Runtime.InteropServices;

class MainClass
{
    public static void Main(string[] args)
    {
        Foobar1 o1 = new Foobar1();
        o1.Num = 123;
        Console.WriteLine(Marshal.SizeOf(o1));
        Foobar2 o2 = new Foobar2();
        o2.Str = "ABC123";
        Console.WriteLine(Marshal.SizeOf(o2));
    }
}

[StructLayout( LayoutKind.Sequential )]
public class Foobar1
{
    private int num;
    public Foobar1()
    {
        num = 0;
    }
    public int Num
    {
        get
        {
            return num;
        }
        set
        {
            num = value;
        }
    }
}

[StructLayout( LayoutKind.Sequential, CharSet=CharSet.Ansi )]
public class Foobar2
{
    [MarshalAs( UnmanagedType.ByValTStr, SizeConst=32 )]
    private string str;
    public Foobar2()
    {
        str = "";
    }
    public string Str
    {
        get
        {
            return str;
        }
        set
        {
            str = value;
        }
    }
}
Avatar billede arne_v Ekspert
18. december 2003 - 20:44 #16
Din formatter ser umiddelbart mere tiltalende ud.
Avatar billede r9 Nybegynder
18. december 2003 - 20:52 #17
ja måske.

Men Stream'en fylder jo også noget.

    byte b = new byte();
            Console.WriteLine("Size: " +    System.Runtime.InteropServices.Marshal.SizeOf(b.GetType()));
           
           
            Stream myStream  = new MemoryStream();
            if (myStream != null)
            {
                IFormatter formatter = new BinaryFormatter();               
                formatter.Serialize(myStream, b);
                Console.WriteLine("size: " + myStream.Length);
                myStream.Close();               
            }


Result:

Size: 1
size: 50
Avatar billede arne_v Ekspert
18. december 2003 - 21:01 #18
Det er fordi de måler to forskellige ting.

binary formatter serializer skriver objektet i dets managed form
d.v.s. at beskrivelsen inkluderer klassens navn etc..

marshal sizeof beregner størrelsen i unmanaged form d.v.s.
størrelsen af de rå data.
Avatar billede r9 Nybegynder
18. december 2003 - 21:23 #19
kan jeg vide præcist hvor meget selve "Streamen" fylder?
Så jeg kan trække det fra..
Avatar billede arne_v Ekspert
18. december 2003 - 21:26 #20
Det er ikke selve streamen men overhead som forklarer at her har vi
en System.Byte af en bestemt version.

Jeg tror ikke at man kan estimere det overhead.
Avatar billede r9 Nybegynder
18. december 2003 - 21:49 #21
ok.

smid lige et svar
Avatar billede arne_v Ekspert
18. december 2003 - 21:51 #22
OK
Avatar billede r9 Nybegynder
18. december 2003 - 21:52 #23
takker.

og lukker.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester