Si no necesita la riqueza de la serialización, si solo quiere escribir una estructura en una matriz de bytes, considere la clase Marshal.
Por ejemplo, considere una aplicación de alquitrán en C#. El formato tar está basado en bloques de 512 bytes, y el primer bloque en una serie tiene una estructura regular. Idealmente, la aplicación solo desea blitt los datos del archivo de disco, directamente en una estructura. El método Marshal.PtrToStructure hace esto. Aquí está la estructura.
[StructLayout(LayoutKind.Sequential, Size=512)]
internal struct HeaderBlock
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 100)]
public byte[] name; // name of file.
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public byte[] mode; // file mode
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public byte[] uid; // owner user ID
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public byte[] gid; // owner group ID
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
public byte[] size; // length of file in bytes
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)]
public byte[] mtime; // modify time of file
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public byte[] chksum; // checksum for header
// ... more like that... up to 512 bytes.
Luego aquí hay una clase genérica que hace el blitting.
internal class RawSerializer<T>
{
public T RawDeserialize(byte[] rawData)
{
return RawDeserialize(rawData , 0);
}
public T RawDeserialize(byte[] rawData , int position)
{
int rawsize = Marshal.SizeOf(typeof(T));
if(rawsize > rawData.Length)
return default(T);
IntPtr buffer = Marshal.AllocHGlobal(rawsize);
Marshal.Copy(rawData, position, buffer, rawsize);
T obj = (T) Marshal.PtrToStructure(buffer, typeof(T));
Marshal.FreeHGlobal(buffer);
return obj;
}
public byte[] RawSerialize(T item)
{
int rawSize = Marshal.SizeOf(typeof(T));
IntPtr buffer = Marshal.AllocHGlobal(rawSize);
Marshal.StructureToPtr(item, buffer, false);
byte[] rawData = new byte[ rawSize ];
Marshal.Copy(buffer, rawData, 0, rawSize);
Marshal.FreeHGlobal(buffer);
return rawData;
}
}
puede utilizar esa clase con cualquier estructura . Debe usar LayoutKind.Sequential y restringirse a tipos blittables (básicamente primitivas y matrices de los mismos) para utilizar este enfoque. Es rápido y eficiente, en términos de código, rendimiento y memoria, pero está un poco restringido en cómo se puede usar.
Una vez que tenga la matriz de bytes, puede transmitirla a través de un NetworkStream, etc., y luego deserializar usando la misma clase en el otro extremo.
acabo de leer lo siguiente: El formateador binario: el formateador binario proporciona codificación binaria para serialización compacta, ya sea para almacenamiento o para flujos de red basados en sockets. La clase BinaryFormatter generalmente no es apropiada cuando los datos se deben pasar a través de un firewall. -------------------- ¿La serialización Xml es buena para pasar por los firewalls? – iTEgg