D’abord, un peu de code:
[code]using System;
using System.Runtime.InteropServices;
namespace Test
{
public static class RawSerializer
{
public static byte[] RawSerialize(object AnyObject)
{
int Size = Marshal.SizeOf(AnyObject);
IntPtr Buffer = Marshal.AllocHGlobal(Size);
Marshal.StructureToPtr(AnyObject, Buffer, false);
byte[] RawData = new byte[Size];
Marshal.Copy(Buffer, RawData, 0, Size);
Marshal.FreeHGlobal(Buffer);
return(RawData);
}
public static object RawDeserialize(byte[] RawData, Type AnyType)
{
int Size = Marshal.SizeOf(AnyType);
if (Size > RawData.Length)
return(null);
IntPtr Buffer = Marshal.AllocHGlobal(Size);
Marshal.Copy(RawData, 0, Buffer, Size);
object ReturnObj = Marshal.PtrToStructure(Buffer, AnyType);
Marshal.FreeHGlobal(Buffer);
return(ReturnObj);
}
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public abstract class Packet
{
private Int32 PropertyPacketId;
public Int32 PacketId
{
get { return (PropertyPacketId); }
set { PropertyPacketId = value; }
}
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public class AcknowledgeMessage : Packet
{
[MarshalAs(UnmanagedType.BStr)]
public string TestString;
}
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
AcknowledgeMessage Message = new AcknowledgeMessage();
Message.PacketId = 6543213;
Message.TestString = "Hello There ,zqdoq oqshgfoqh oihqsohgsoq hfsgh dhg";
byte[] Buffer = RawSerializer.RawSerialize(Message);
Message = null;
AcknowledgeMessage Result = (AcknowledgeMessage)RawSerializer.RawDeserialize(Buffer, typeof(AcknowledgeMessage));
Console.WriteLine(Result.PacketId);
}
}
}[/code]
Alors ce qui m’inquiètes, c’est que quelque soit la taille de Message.TestString, la taille de mon buffer fait toujours 8 bytes. Mon petit doigt me dit: bah ca doit etre des pointeurs vers les variables.
Je pensais vérifier ma théorie en mettant Message = null; mais visiblement, même après ca, il me trouve encore ma TestString correcte…
Est ce que quelqu’un peut m’expliquer? C’est une histoire de garbage collector qui a pas le temps de nettoyer la classe?
Comment faire pour que toute la classe transite dans le buffer, et non pas seulement les pointeurs?