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)
Annonceindlæg tema
Forsvar & beredskab
Cybersikkerhed, realtidsdata og robuste it-systemer er blevet fundamentet for moderne forsvar.
17. december 2003 - 13:28
#1
sizeof?
17. december 2003 - 13:29
#2
Marshal.SizeOf() måske ?
r9
Nybegynder
17. december 2003 - 13:31
#3
sizeof findes ikke på "obejct". Jeg skal bruge det på alle objecter.
r9
Nybegynder
17. december 2003 - 13:31
#4
arne_v: prøver lige..
17. december 2003 - 13:35
#5
sizeof kan kun bruges i unsafe kode i C#. Alternativt findes: System.Runtime.InteropServices.Marshal.SizeOf
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."
r9
Nybegynder
17. december 2003 - 13:47
#7
myObject er Managed C# kode
17. december 2003 - 15:55
#8
Er klassen serializable ?
r9
Nybegynder
17. december 2003 - 19:05
#9
ja den er serializable
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 ?
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);
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"));
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(); }
18. december 2003 - 20:35
#14
Jeg sidder og brygger på noget.
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; } } }
18. december 2003 - 20:44
#16
Din formatter ser umiddelbart mere tiltalende ud.
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
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.
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..
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.
r9
Nybegynder
18. december 2003 - 21:49
#21
ok. smid lige et svar
18. december 2003 - 21:51
#22
OK
r9
Nybegynder
18. december 2003 - 21:52
#23
takker. og lukker.
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.